最近正在看阿里公司的笔试题,有很多算法题和技术题,用来复习也很不错。其中有一题引起了我的注意,题目是这样说的:
答案说是选B。当时我就懵了,废话,选什么我不是懵的。
在经过与同学激情讨论后发现这玩意儿贼有意思!
首先,这个就是个Lowbit,写成这样:
#define lowbit(x) ((x)&(-x))
或者是这样:
int Lowbit(x){
return x & -x ;
}
lowbit(x)的意思是将 x 转化成二进制数之后,只保留最低位的1及其后面的0,截断前面的内容,然后再转成10进制数。
比如说lowbit(7),7的二进制位是111,lowbit(7) = 1;
又比如6的二进制是110,最低位的1是倒数第二位,所以保留了二进制的10,所以lowbit(6) = 2。以此类推可以得知这题选B。
没看懂我们再来说原理:
例子1:设x=1。
首先十进制转二进制(设位数为8):
1 —> 00000001
-1 —> 1111 1111(1的补码)
之后进行下一步操作,取&:
0 0 0 0 0 0 0 1
& 1 1 1 1 1 1 1 1
= 0 0 0 0 0 0 0 1
所以1&(-1) =