阿里笔试题:x&(-x),关于 Lowbit(x)的一点尝试性探究

最近正在看阿里公司的笔试题,有很多算法题和技术题,用来复习也很不错。其中有一题引起了我的注意,题目是这样说的:

习题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。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容