有关位操作
来源:互联网 发布:美橙表业淘宝上没有 编辑:程序博客网 时间:2024/06/05 06:28
1,统计一个整数二进制式‘1’的个数:
假如一个数n=0x1110 0010,那么n - 1 = 0x1110 0001, 也就是把最右边的那个1变为0,然后左边的都变成1
如果让他们“与”运算的话,就等于把数n的最右边的1变为0,其余的位不变。这样循环m次(m位1的个数)就可以把n变成0,此时也就可以统计出1的个数了。
int NumOnes(int number)
{
int cnt = 0;
while(number != 0)
{
number &= (number - 1);
cnt++;
}
return cnt;
}
2.、给定一个32bit的数值,如果输出比特位反转后的值,如对于4bit的二进制值1011,翻转后为1101。要求复杂度O(lgn),n 为比特位数
这道题主要是有时间复杂度的限制,即lgn次,也就是说32bit你只能运算5次就要得出结果出来。
int GetInverse(int source)
{
int target= 0;
while (source> 0)
{
target = (target<< 1)| (source & 0x01);
source = source>> 1;
}
return target;
}
这个算法时间复杂度位O(n).不符合题目要求。
其实我们可以想想,有32bit,肯定要运用分治的方法
第1次:我们可以先对第0,1位,让他们互换,(2,3), (4,5),。。。,(30,31)这些对调位置如:
0x1001 0001 ==> 0x 0110 0010
第2次:可以对(0,1,2,3),(4,5,6,7),。。。,(28,29,30,31),如:
0x 0110 0010 ==> 0x 10011000
第3次:对(0,1,2,3,4,5,6,7)。。。,让他们对调位置
第4次(0,1,2,。。。,15)
第5次(0,。。。,31)结束.
现在要解决怎样处理让第i位和第i+1位对调,像(0,1)
可以这样完成; y = 0x55555555 二进制位:0x0101 0101 0101 0101 0101 0101 0101 0101
x = (((x>> 1)& y) | ((x & y)<< 1));
现在来解释一下这个操作:((x>>1)&y) 其实就是先把x右移一位,在和y做“与”运算,得出的结果就是取出了x右移一位后所有的第0,2,4,6,8,...., 30位的数,因为这里y在这位上是1其他位为0,也就是原来x的第1,3,5,7,。。。31位数。
而:(x & y) <<1 是取出x的第1,3,5,7,。。。,31位,然后把它左移,
最后在把他们“或”运算,这样就达到了(0,1),(2,3),。。。,位对调的效果了。
后面的情况类似,所以最终代码是这样的:
unsigned int reverse_32bit( unsignedint x)
{unsigned int y= 0x55555555;
x = (((x>> 1)& y) | ((x & y)<< 1));
y = 0x33333333;
x = (((x>> 2)& y) | ((x & y)<< 2));
y = 0x0f0f0f0f;
x = (((x>> 4)& y) | ((x & y)<< 4));
y = 0x00ff00ff;
x = (((x>> 8)& y) | ((x & y)<< 8));
return((x>> 16)| (x << 16));
}
- 有关位操作
- 有关位操作
- 有关位操作的总结
- 位操作以及与位操作有关的面试题
- 嵌入式经典面试题---C中有关预处理,关键字const、volatile、static,位操作,等等
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- bochsdbg调试保护模式程序的方法
- 在Spring中使用JMS
- MDIO master VIP 图解 (ArrayBox的妙用)
- 字符串倒序输出的两个写法
- 实现的一个聊天程序
- 有关位操作
- smarty内建函数的实例代码(一)
- VC 实现自绘 窗体 标题栏 非客户区
- 我是如何学习Xcode下Objective C开发的?
- 使用JDBC处理大数据和大文本
- 使用tsocks做代理
- C++ 遍历文件夹及其子文件(夹)
- C6表单中转下一步计算文本框值的方法
- iphone 学习标兵