判断2的幂

问题:

一行代码,判断给定的整数是否是一个2的幂。

计算机基本运算

仅对寄存器中的数据进行运算   
计算机中最基本的操作,一个时钟周期完成   
需要控制信号   
  • 按位运算(C语言符号) – 针对二进制

    • 按位与(&)

      ABA&B
      000
      010
      100
      111

      按位与可以实现功能:
      提取二进制数中的指定位。

       1101 1001  
      &0000 1111
       0000  1001
      
    • 按位或(|)
      功能:
      特定位上的无条件赋值

       1101 1000
      |0000 0001
       1101 1001 
      
    • 按位取反(~)

    • 按位异或(^)
      功能:

      • 判断两个二进制数是否相等

         1101 1000
        ^1101 1000
         0000 0000
        
      • 按位取反

         1101 1000
        ^1111 1111
         0010 0111
        
  • 逻辑运算 – 针对表达式返回值(只有真1和假0)进行操作

    • 逻辑与(&&)
    • 逻辑或(||)
    • 逻辑非(!)
  • 移位运算
    移位本身不区分算术、逻辑移位,可用于实现提取信息时候使用
    • 算术移位 – 二进制有符号数
      • 算术左移(<<)
        高位移出,地位补0。
        功能:
        乘以2
        溢出判断:若移出的位不等于新的符号位,则移出。
      • 算术右移
        右移时注意符号位问题。低位移出,高位补数符。可能发生数据丢失。
        功能:
        除以2
    • 逻辑移位 – 二进制无符号数(比如地址值)
      无符号数逻辑左(右)移,高(低)位移出,低(高)位补0。
      若高位移出的是1,则左移时发生溢出!
      • 逻辑左移
        功能同算术运算
      • 逻辑右移
        功能同算术运算

答案:

(b & (b-1)) == 0
提示:所有的2的幂二进制都是最高位为1,其余位为0,形如10…00;当进行减一后,形如01…11,然后进行按位与操作,判断结果是否等于0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值