韩顺平 java 第二十讲 二进制、位运算、移位运算符

计算机二进制中的原码、补码、反码

计算机内部处理的信息都是采用二进制数来表示。进位规则是“逢二进一”
int a = 1;
int类型是4个字节,一个字节等于八个bit。所以一共32bit。


重点内容

  • 二进制的最高位是符号位,0代表正数,1代表负数
  • 正数的原码补码反码都一样
  • 负数的反码=它的原码符号位不变其他位取反
  • 负数的补码=它的反码+1
  • 0 的反码、补码都是0
  • java没有无符号数,也就是说java中的数都是有符号的
  • 在计算机计算的时候,都是以补码的方式来运算的

例子:模拟计算机计算1-2的过程

相当于:1+(-2)
1的补码:0000……0001
-2的原码:1000……0010
-2的反码:1111……1101
-2的补码:1111……1110
所以:1和-2的补码相加:
得到:1111……1111
结果是补码。结果如果是正数的话,原码就是结果;但这个结果是负数,所以还要装换成原码:
结果的补码:1111……1111
结果的反码:1111……1110
结果的原码:1000……0001
也就是-1!

位运算符和移位运算符

  • 这些操作都是准对补码来说的,操作之前都要转换成补码
  • 4个位运算,分别是:按位与&、按位或|、按位异或^、按位取反~;这几个运算都是针对补码来运行的。
  • 3个移位运算:算数左移<<(低位溢出,符号位不变,并用符号位补溢出的高位);算数右移>>(符号位不变,低位补零);逻辑右移>>>(低位溢出,高位补零)

求下列输出结果:

int a = 1>>2;
//结果:0
//1的补码:0000……0001
//右移两位:0000……0000(符号位为0)
int b = -1>>2;
//结果:-1
//-1的原码:1000……0001
//-1的反码:1111……1110
//-1的补码:1111……1111
//所以-1右移多少位都是-1
int c = 1<<2;
//结果:4
//相当于乘以二
int d = -1<<2;
//结果:-4
//-1的补码:1111……1111
//左移2位:1111……1100
//结果的反码:1111……1011
//结果的原码:1000……0100
//也就是-4
int e = 3>>>2;
//结果:0
//3的补码:0000……0011
//逻辑右移3位:0000……0000
int a = ~2
//结果是:-3;过程如下:
//2的补码是:0000……0010
//取反之后是:1111……1101
//很明显这个是负数的补码,要转换成原码:
//结果的反码是:1111……1100
//结果的原码是:1000……0011
//也就是-3
int c = 2&3
//两个都是正数
//2的补码:0000……0010
//3的补码:0000……0011
//&之后:  0000……0010
//这个也是结果的原码,就是2
int d = 2|3
//这个同上个,结果是:3
int e = ~-5
//-5原码:1000……0101
//-5反码:1111……1010
//-5补码:1111……1011
//取反:   0000……0100
//是正数,所以结果是:4
int f = -3^3
//-3 的原码:1000……0011
//-3反码:1111……1100
//-3补码:1111……1101
//3补码:0000……0011
//然后二者异或:1111……1110(补码,负数:还需要转换成原码)
//结果的反码:1111……1101
//结果的原码:1000……0010
//也就是:-2
  • 如何用最快的方法判断一个数是2的n次方?移位运算
  • 如果用最快的方法将一个数变成原来的二倍?移位运算
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值