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

原创 2017年01月03日 22:29:13
#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;
}

程序员面试金典: 9.5位操作 5.7寻找丢失的整数

#include #include #include #include using namespace std; /* 问题:数组A包含0到n的所有整数,但其中缺了一个。在这个问题中,只用...

【C】写一个宏将一个数字的奇数位和偶数位交换。实现两个int(32位)整数m和n的二进制表达中,位(bit)不同的个数

1.写一个宏将一个数字的奇数位和偶数位交换。 #define _CRT_SECURE_NO_WARNINGS 1 #include #define CHANGE(X) \ ((X & (0x55...

几道经典的有关整数二进制的编程题(如:一个数二进制位的偶数位和奇数位交换)

1.//求一个数二进制中含有多少个1 //2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列 //3.写一个程序将一个数的二进制表示中奇数位和偶数位进行交换。 //4.输出二进...

程序员面试金典: 9.5位操作5.2对一个浮点数,打印它的二进制表示

#include #include #include #include using namespace std; /* 问题:给定一个介于0和1之间的实数(如0.72),类型为double...

c语言实现一个正整数返回二进制参数的偶数位和奇数位顺序输出

编写了一个程序实现一个正整数返回二进制参数的偶数位和奇数位顺序输出,但是总觉得自己写的很麻烦,但实在想不出来怎么改的更好,毕竟只是个c入门,不懂的地方还有很多,一些语言自身能力没有办法去简化,还需要大...

编程题(从键盘上输入一个整数,分别计算奇数位和偶数位之和)

编程题         从键盘上输入一个整数,分别计算奇数位和偶数位之和。 1.首先需要明白,什么是奇数位?什么是偶数位? 一个整数,个位为奇数位,十位为偶数位,百位为奇数位,...以此类推。 2.分...

程序员面试金典: 9.5位操作 5.8通过位操作进行两点连线

#include #include #include #include #include using namespace std; /* 问题:有个单色屏幕存储在一个一维字节数组中,使得...

Pace 6 (1.写一个函数返回参数二进制中 1 的个数;2..获取一个数二进制序列中所有的偶数位和奇数位;3. 输出一个整数的每一位;4.两个int整数的二进制表达中,有多少个位不同

//1.写一个函数返回参数二进制中 1 的个数 #include int count_one_bits(unsigned int value) { int count = 0; while (...
  • J4Ya_
  • J4Ya_
  • 2017年10月26日 21:55
  • 42

用宏实现函数—1.写一个宏可以将一个数字的奇数位和偶数位交换 2.求两个数中求较大值

交换奇数位和偶数位的方法: 1.奇数位与1偶数位与0得到奇数位 num&0101 0101 0101 0101 0101 0101 0101 0101  2.奇数位与0偶数位与1得到偶数位 num...

写一个宏可以将一个数字的奇数位和偶数位交换

宏函数在c语言编程中有不可忽视的作用,并且数字二进制的奇偶位交换也比较常见,所以用宏函数来实现数字二进制的奇数位和偶数位交换不失为一个很好的方法。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序员面试金典: 9.5位操作 5.6交换某整数的奇数位和偶数位
举报原因:
原因补充:

(最多只允许输入30个字)