JAVA位运算非完全详解

本文深入解析Java中的位运算,包括二进制数的补码表示、按位与、按位或、按位异或、按位取反以及位移运算符的使用方法。通过实例演示正数与负数的位运算过程,帮助读者理解位运算在编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA位运算

  • 8进制:0开头整数,做多是7
  • 16进制,以0x开头,做多是F,不管X还是x都可以,依照个人习惯即可
  • Java使用 补 码 来 表 示 二 进 制 数 ,在补 码 表 示 中 ,最高 位 为 符号 位 ,正数 的 符 号 位 为 0,负数 为 1。补 码 的 规 定 如 下 :

1、对 正 数 来 说 ,最高位为 0,其余 各 位 代 表 数 值 本 身 (以二 进制 表 示 ),如 +42的补码 为 00101010。

2、对 负 数 而 言 ,把该 数 绝 对 值 的 补 码 按 位 取 反 ,然后 对 整 个数 加 1,即得 该 数的 补 码 。如 -1的补 码 为11111111111111111111111111111111(计算过程:00000000000000000000000000000001按 位 取 反 11111111111111111111111111111110+1=11111111111111111111111111111111 )。

对于正数来说首位为0代表符号位,表示正数
对于负数来说首位为1代表符号位,表示负数
为何有那么多0、1,java中int是32位的,对于+42而言,因为是正数,不需要取反,所以只需要8位就足以表示,而-1需要取反,所以需要扩充至32位

按位运算

  • 1、按位 并(AND):&,把每一位按照AND进行,0是false,1是true,两个数按二进制计算,一旦有一位是0,则结果是0
操作第一位第二位第三位
操作数1001
操作数2011
按位与(&)011

例如:十进制10按位与十进制12–>
     二进制1010按位与二进制1100–>
            二进制结果1000–>
               十进制结果8–>
                    结束
   十进制-6按位与十进制-2–>
        二进制-6的绝对值是110,-2的绝对值是10–>
             二进制-6补码为:扩充至32位并取反并+1:11111111111111111111111111111010
            二进制-2的2补码为:扩充至32位并取反+1:11111111111111111111111111111110             按位于的结果为:1111111111111111111111111111010
            由于首位为1,代表负数,所以需要获取源码,步骤为:-1后取反
            结果为:1111111111111111111111111111001取反
            结果为:000000000000000000000000110
            最后加上符号,结果为:-6
            结束
正数与负数进行按位与(&)操作,原理同上,只需要看按位与之后的首位来判断符号。

  • 按位 或(OR):|,把每一位按照OR进行,0是false,1是true,两个数按二进制计算,一旦有一位是1,则结果是1
操作第一位第二位第三位第四位
操作数10011
操作数20101
按位或(|)0111
  • 按位 异或(XOR):^,把每一位按照OR进行,0是false,1是true,两个数按二进制计算,两位不一样是1,一样是0
操作第一位第二位第三位第四位
操作数10011
操作数20101
按位或(|)0110
  • 按位 取反(按位非):~,每一位取反
操作第一位第二位
操作数101
按位非(~)10

位移运算符

  • 符号: >>>:无符号右移,符号位一起右移,左边补0,
    低位溢出,高位补0。注意,无符号右移(>>>)中的符号位(最高位)也跟着变,无符号的意思是将符号位当作数字位看待。如:-1>>>1结果为2147483647。这个数字应该比较熟悉,看两个输出语句就知道是什么了:

System.out.println(Integer.toBinaryString(-1>>>1));

System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));

输出结果为:

1111111111111111111111111111111

1111111111111111111111111111111

  • 符号:>>:带符号右移,符号位不动,其余位右移,符号位后高位正数补0,负数补1
    例如:10进制-6转换为1110,其中第一位1为符号位,负数进行右位移,获取其二进制补码,右移后高位补符号位,最后符号位不变,减一后按位取反
  • <<:左移,低位补0
  • 例如:2<<2结果即为8,十进制2转换成2进制为0010,左移两位。实际上使用计算的不是4位或8位,使用的是32位进行的位移
  • 右移可以忽略
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值