程序员面试金典---5.5 调试

题目:调试

解释代码((n & (n-1)) == 0)的具体含义?

一、思路

我们可以由外而内来解决这个问题。

1.(A&B)== 0 含义

( A & B ) = = 0 (A\&B)==0 (A&B)==0 的含义是,A和B二进制表示的同一位置绝不会同时为1。因此,如果 ( n & ( n − 1 ) ) = = 0 (n\&(n-1))==0 (n&(n1))==0,则n和n-1就不会有共同的1。

2.相比n,n-1长什么样

在这里插入图片描述
如上所示:当要将一个数减去1时,需要注意最低有效位。如果最低有效位为1,则变为0,完毕。如果是0,你就必须从高位“借”1.因此,要逐一前往更高的位,将每个位从0改为1,直至找到1为止,并将这个1翻转成0,完毕。

综上所述,n-1形似n,只不过n中低位的0在n-1中变为1,n中最低有效位的1在n-1中变为0,示例如下。
在这里插入图片描述

3.那么, ( n & ( n − 1 ) ) = = 0 (n \& (n-1)) == 0 (n&(n1))==0 究竟表示什么?

n和n-1不存在同一位均为1的情况,因为两者的二进制表示如下:
在这里插入图片描述
abcde必定全为0,也就是说,n必须形如00001000,因此,n的值是2的某次方。
综上所述,这个问题的答案为: ( n & ( n − 1 ) ) = = 0 (n\&(n-1))==0 (n&(n1))==0 检查n是否为2的某次方(或者检查n是否为0)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值