程序员面试金典: 9.5位操作 5.6交换某整数的奇数位和偶数位

#include <iostream>
#include <stdio.h>

using namespace std;

/*
问题:编写程序,交换某个整数的奇数位和偶数位,使用指令越少越好(也就是说,位0与位1交换,位2与位3交换,依此类推)
分析:比如1011: 0111,也就是向前移动,
      【注意最高位需要移动到最低位处,陷阱是:所看到的最高位可能不是正确的,需要分析
      如果该整数为正整数,那么没有问题,直接按照上述处理:
	  如果为负整数,比如 -8转换为-(0000 0000 0000 0000 0000 0000 0000 1000) =>
	                               1111 1111 1111 1111 1111 1111 1111 1000
								   那么其实负数的最高位是1 ,似乎是没有陷阱的 】
	  问题的本质是让我们减少指令次数,如果记录整数的最高位的值为h,最低位为l,将n向左移动1位,然后将n和h进行或运算,
	  总共指令 = 寻找整数n最高位h + n左移1次 +  n与h或运算
	  关键就是寻找最高位h,32位整数只需要将 n & (1 << 32) 的值记为h即可,所以总共只需要3次
	  注意要判定当前系统的整数位
输入:输入1个十进制整数,整数可能为负数
11
-8
输出:
7
-12

弄错:误解题目意思,题目意思不是左移,而是奇数位和偶数位分别交换。
      1001 -> 0110
	  所谓的交换 = 奇数位

关键:
1
书上解法:
牛逼,设整数为n,通过 n & 10101010 提取出奇数位的值为nOdd, 然后将nOdd向右移动1位
                     n & 01010101 提取出偶数位的值为nEven, 然后将nEven向左移动1位
					 将nOdd 与 nEven 进行或运算,
没想到单独提取奇数位和偶数位
所以共需要5次= 提取奇数位+提取偶数位+奇数位右移1位+偶数位左移一位+奇数位与偶数位对应的数进行或运算
2 10101010转换为十六进制为0xaaaaaaa
*/

int swapOddAndEvenBit(int n)
{
	int nOdd = n & (0xaaaaaaaa);
	int nEven = n & (0x55555555);
	nOdd >>= 1;
	nEven <<= 1;
	int result = nOdd | nEven;
	return result;
}

void process()
{
	int n;
	while(cin >> n)
	{
		n = swapOddAndEvenBit(n);
		cout << n << endl;
	}
}

int main(int argc, char* argv[])
{
	process();
	getchar();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值