Java位运算基础

前言

现代的电子计算机技术全部采用的是二进制,因为它只使用0和1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息都是采用二进制数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是“逢2进1”,数字1在不同位置上代表不同的值,按从右至左的次序,这个值按2倍递增。bit(位)是计算机中的最小存储单位,0和1是基本算符。byte 、short 、char 之间可以进行计算,计算时需要先将其转换成int类型;Java整数类型包括:byte(=8bit)、short(=16bit)、int(=32bit)、long(=64bit)

位运算符

&、|、^、~、>>(算术右移)、<<(算术左移)、>>>(逻辑右移/无符号右移)
算数右移运算规则:低位溢出,符号位不变,并用符号位补溢出的高位
算术左移运算规则:符号位不变,低位补0
逻辑右移/无符号右移运算规则:低位溢出,高位补0

原码、反码、补码

Java没有无符号数,即Java中的数都是有符号的,所以对有符号而言,原码、反码、补码的规则如下:
1、二进制的最高位是符号位,0代表整数,1代表负数;
2、正数的原码、反码、补码都一样,0的原码、反码、补码都是0;
3、负数的反码=它的原码符号位不变,其他位按位取反负数的补码=它的反码+1,负数的反码=它的补码-1;
特别备注:计算机内部以补码形式进行位运算,以原码形式显示结果

负数的位运算步骤:

1、得到负数的补码
(1)进制转换:根据进制转换规则将负数转换成二进制数,即得到原码
(2)负数的反码:根据原码计算负数的反码,即原码符号位不变,其他位按位取反
(3)负数的补码:根据负数的反码计算它的补码,即它的反码+1
2、计算机以补码形式将负数的补码进行位运算(运算结果是补码)
3、将补码形式的运算结果转为原码
(1)判断结果的补码是正数还是负数
(2)如果当前补码的最高位为0,即结果为正数,则原码=补码,即所查看的位运算结果就是与补码相同的原码进行转换后的结果
(3)如果当前补码的最高位为1,即结果为负数,则先根据“负数的反码=它的补码-1”,得到结果的反码,再根据“负数的反码=原码符号位不变其他位按位取反”,得到结果的最终的原码
4、根据原码进行进制转换:最终查看的结果即为该原码进制转换后的结果。

位运算具体示例

一、按位与:2 & 3

1、得到运算数字2和3的补码
(1)2的补码 = 00000000 00000000 00000000 00000010
(2)3的补码 = 00000000 00000000 00000000 00000011
2、计算机以2和3的补码形式进行按位与的位运算(运算规则:0 & 0 = 0、0 & 1 = 0 、1 & 0 = 0、1 & 1 = 1)
按位与结果 = 00000000 00000000 00000000 00000010
3、将补码形式的运算结果转为原码
(1)判断当前结果的补码最高位是0,即位运算结果是正数,所以原码 = 补码
4、根据原码进行进制转换:二进制数10 = 十进制数2,即 2 & 3 = 2

二、负数按位取反:~-2

1、得到运算数字-2的补码
(1) -2的原码 = 100000000 00000000 00000000 00000010
(2)-2的反码= 111111111 11111111 11111111 11111101 (符号位不变
(3)-2的补码 = 11111111 11111111 11111111 11111110
2、计算机以-2的补码形式进行按位取反的位运算(运算规则: ~1= 0; ~0= 1)
按位取反 运算结果 00000000 00000000 00000000 00000001
3、将补码形式的运算结果转为原码
(1)判断当前结果的补码最高位是0,即位运算结果是正数,所以原码 = 补码
4、根据原码进行进制转换:二进制数01 = 十进制数1,即~2 = 1

三、正数按位取反:~2

1、得到运算数字2的补码
(1)2的补码 00000000 00000000 00000000 00000010
2、计算机以2的补码形式进行按位取反的位运算
按位取反 运算结果 11111111 11111111 11111111 11111101
3、将补码形式的运算结果转为原码
(1)判断当前结果的补码最高位是1,即位运算结果是负数,负数的补码 = 负数的反码 + 1;
(2)先根据“负数的反码=它的补码-1”,得到结果的反码
结果的补码 11111111 11111111 11111111 11111111 11111101
结果的反码 11111111 11111111 11111111 11111111 11111110
(3)根据“负数的反码=原码符号位不变其他位按位取反”,得到结果的最终的原码
结果的原码 100000000 00000000 00000000 00000001
4、根据原码进行进制转换:即~2 = -1

thinks:

(1)0代表正数=正数默认不带+号,1代表负数=负数必须带-号;
(2)负数反码和按位取反的区别与联系:①负数的反码是它的原码符号位不变**其他位按位取反;②位运算过程中的按位取反包括符号位(即最高位)全部按位取反;
(3)计算机内部使用补码同一正数和负数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值