最近正在看阿里公司的笔试题,有很多算法题和技术题,用来复习也很不错。其中有一题引起了我的注意,题目是这样说的:
习题2.28
答案说是选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) = 1。
例子2: 设x = 6
首先十进制转二进制(设位数为8):
6 —> 0000 0110
-6 —> 1111 1010(6的补码)
之后进行下一步操作,取&:
0 0 0 0 0 1 1 0
& 1 1 1 1 1 0 1 0
= 0 0 0 0 0 0 1 0
所以6&(-6) = 2。
总结:lowbit(x)=2^p
其中:P是指将x转化为二进制之后从右往左数第一个一的位置。
比如1的二进制写作0000001,1处于第0位,所以p=0, 2^0=1, 所以lowbit(1)=1;
比如6的二进制写作0000110,1处于第1位,所以p=1, 2^1=2, 所以lowbit(6)=2。
所以针对本题目,2^31-3化为二进制后最后四位为:1101。所以p=0, 20=1,所以lowbit(231-3)=1。
所以这题选B。