关于位运算的小笔记~

一、前言

看视频的时候有看到讲位运算,感觉听得蒙蒙的,看到了一些关于位运算的文章,感觉挺有意思的,所以,做个笔记吧~~

二、代码

1、不用加号实现两个数相加

public class Bitwise {
    public static void main(String[] args) {
        //不用加号实现加法
        int a = 3;
        int b = 4;
        while(b != 0){
            //temp_a存储a和b异或的结果 相当于不带进位的加法
            int temp_a = a ^ b;
            //temp_b存储a和b按位与结果并左移一位 这相当于计算进位 因为只有两个都为1的时候才产生进位
            int temp_b = a & b << 1;

            //更新a为不带进位的加法结果
            a = temp_a;
            //更新b为进位
            b = temp_b;
        }
        //当没有进位的时候 a中存储了最终结果
        System.out.println(a);
    }
}

2、判断一个数字是否为2的k次幂

当一个数字是2的幂时它的最高位为1

2(10) 4(100) 8(1000)

设这个初始数字为n

n-1时除了最高位其余位置都为1

1(01) 3(011) 7(0111)

所以当n&(n-1)==0时说明这个数字就是2的k次幂

 static boolean Check(int n){
        //检查n是否大于0 2的幂必须为正数 因为0和负数都不是2的幂
        //检查n和n-1按位与操作是否为0
        //如果n是2的幂 则未禁止表示只有一个1
        //例如2(10)4(100)8(1000)
        //当n是2的幂时 n-1的二进制表示是n的最高位1变为0 其余位置变为1
        //例如2(10)-1 = 1(01)   4(100)-1 = 3(011)
        //因此n&(n-1)得到0
        return n > 0 && (n & (n-1))==0;
 }

三、总结

位运算是一个很快的运算,也很有意思,也很复杂。。。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值