【Java学习笔记】位运算

位运算


一、原码,反码,补码

  • (1) 二进制的最高位符号位0 表示正数1 表示负数(怎么记? 1旋转一下变成-

  • (2) 正数的原码、反码、补码都一样(三码合一

  • (3) 负数的反码=它的原码符号位不变其他位取反(0 - > 1 , 1 - > 0)

  • (4) 负数的补码=负数的反码+1,负数的反码=负数的补码 - 1

  • (5) 0 的反码,补码都是 0

  • (6) java 没有无符号数,换言之,java 中的数字都是有符号的

  • (7) (很重要!!!)在计算机运算的时候,都是以补码的方式来运算的

  • (8) (重点!!!)当我们看运算结果的时候,要它的原码


二、位运算

1. 位运算符

  • (1)按位与&

  • (2)按位或|

  • (3)按位异或^

  • (4)按位取反~

2. 运算规则

  • 注意:先将左右操作数转换成二进制,计算过程是采用补码计算

  • 按位&:两位全为 1,结果为 1,否则为 0

  • 按位或|:两位有一个为 1,结果为 1,否则为 0

  • 按位异或^:两位一个为 0,一个为 1,结果为 1,否则为 0

  • 按位取反~:0 - > 1 , 1 - > 0

  • 算术右移2 位 >>:低位溢出(指的是保存十进制数值所需要的二进制位数),符号位不变,并用符号位补溢出的高位

    • int a=1>>2 : // 1 => 00000001 => 00000000 (标黄的就是溢出的位

    • 本质 :1 / 2 / 2 = 0

    • 速算结果:左操作数作为被除数,右操作数表示除于二的次数,结果即为操作结果值

  • 算术左移2 位 <<:符号位不变,低位左移(指的是保存十进制数值所需要的二进制位数),低位补 0

    • int c=1<<2; // 1 => 00000001 => 00000100

    • 本质:1*2*2 = 4

    • 速算结果:左操作数作为乘数,右操作数表示乘以二的次数,结果即为操作结果值

  • 逻辑右移 >>>:符号位也无符号右移,运算规则是:低位溢出,高位补 0

  • 特别说明:没有 <<< 符号


三、运算方法代码示例

说明:由于数据类型是int类型,所有采用四个字节大小

// 位运算
public class BitOperator {

    // 编写一个main方法
    public static void main(String[] args) {

        // 推导过程
        // 1. 先得到 2的补码 => 2的原码 00000000 00000000 00000000 00000010
        //    2的补码 00000000 00000000 00000000 00000010
        // 2. 3的补码 3的原码 00000000 00000000 00000000 00000011
        //    3的补码 00000000 00000000 00000000 00000011
        // 3. 按位&
        //    00000000 00000000 00000000 00000010
        //    00000000 00000000 00000000 00000011
        //    00000000 00000000 00000000 00000010 & 运算后的补码
        //    运算后的原码 也是 00000000 00000000 00000000 00000010
        //    结果就是 2
        System.out.println(2 & 3); // 2

        // 推导
        // 1. 先得到 -2的原码 10000000 00000000 00000000 00000010
        // 2. -2的 反码 11111111 11111111 11111111 11111101
        // 3. -2的 补码 11111111 11111111 11111111 11111110
        // 4. ~-2操作 00000000 00000000 00000000 00000001 运算后的补码
        // 5. 运算后的原码 就是 00000000 00000000 00000000 00000001 => 1
        System.out.println(~-2); // 1

        // 推导
        // 1. 得到2的补码 00000000 00000000 00000000 00000010
        // 2. ~2操作 11111111 11111111 11111111 11111101 运算后的补码
        // 3. 运算后的反码 11111111 11111111 11111111 11111100
        // 4. 运算后的原码 10000000 00000000 00000000 00000011 => -3
        System.out.println(~2); // -3

        System.out.println(1 >> 2); // 0
        System.out.println(1 << 2); // 4
        System.out.println(4 << 3); // 4 * 2 * 2 * 2 = 32
        System.out.println(15 >> 2); // 15 / 2 / 2 = 3

        System.out.println(-10.4 % 3); // -1.4 近似值

        int i = 66;
        System.out.println(++i + i); // 134
    }
}

小结

一、对于 &|^~ 的运算

  • (1)首先得到操作数的补码

  • (2)看是什么运算符,回想对应的操作规则,在操作数的补码基础上按照规则操作,得到操作后的补码

  • (3)把操作后的补码转成源码,得到操作结果

二、对于 >><< 的运算

  • 按照速方法速算结果即可

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackson凌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值