您的位置:首页 > 编程语言 > Java开发

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

2015-09-26 17:19 381 查看

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

计算机内部处理的信息都是采用二进制数来表示。进位规则是“逢二进一”

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次方?移位运算

如果用最快的方法将一个数变成原来的二倍?移位运算
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: