求下面函数的返回值(微软)
假定x = 9999。 答案:8
思路:将x转化为2进制,看含有的1的个数。
求下面函数的返回值(微软) -- 统计1的个数
-------------------------------------
假定x = 9999
10011100001111
答案: 8
思路: 将x转化为2进制,看含有的1的个数。
注: 每执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,因为x-1将会将该位(x用二进制表示时最右边的一个1)变为0。
判断一个数(x)是否是2的n次方?
-------------------------------------
注:
(1) 如果一个数是2的n次方,那么这个数用二进制表示时其最高位为1,其余位为0。
(2) == 优先级高于 &
网友1:
x=x&(x-1)
我的总结: 就用e1作为例子 第一次位于运算的结果是01000000 那么继续x-1,则x-1=00111111 那么继续位于运算: 01000000&00111111=00000000 此时循环的变量x为0,循环终止。 用来计数的countx也就是说明了二进制数种有几个1. 但是我们传进去的参数是整数,例如传9999呢? 看到&运算,肯定是变成二进制算,所以传什么就是多虑了。
网友2: 位运算。 我觉得楼主应该知道&这个是位运算中的位与运算, |
网友3:
<Hacker 's Delight> 这本书第1章就有介绍,这种算法是把一个二进制数最右边的一个1变成0。
一个简单的程序,先给出运算结果:
1011001
1011000
1010000
1000000
这是代码:
网友4:
那可以通过调试找出一点规律~~~ |
网友5:
位运算里有学问呀, |
更正:
void swap(int i1, int i2)
改成:
void swap(int& i1, int& i2)