原码、反码、补码和位运算
原码、补码、反码和位运算
一、对于有符号的而言:(以下8点一定要背下来)
1、二进制的最高位为符号位:0表示正数,1表示负数。
2、正数的原码、反码、补码相同
3、负数的反码 = 它的原码的符号位不变,其它位取反(0 -> 1 , 1 -> 0).
4、负数的补码 = 它的反码 + 1 ; 负数的反码 = 它的补码 - 1 。
5、0的反码、补码都是0 。
6、Java没有无符号数,换言之,java中的数都是有符号的
7、在计算机运算的时候,都是以补码的方式来运算的。
8、当我们看运算结果的时候,要看他的原码。
=====================================
二、位运算
ps:需要利用二进制来运算(1、0)
一、位运算(移位运算>>、<<,无符号移位运算>>>)
1、算数右移 > > :低位溢出,符号位不变,并用符号位补溢出的高位。(移几位就相当于 除2的几次方)
ps:是通过二进制来运算的,所以是2的几次方
正数在溢出的值超过本身时都为0,负数溢出的值超过本身时都为-1。
例: 7>>2=1
7>>3 = 0
7>>4 = 0
…
-7>>2 = -2
-7>>3 = -1
-7>>5 = -`1
…
2、算数左移 < < : 符号位不变,低位补0()
(移几位就相当于乘2的几次方)
3、> > > 逻辑右移(无符号右移):低位溢出,高位补0
4、特别说明:没有< < < 符号
public static void main(String []args){
int a = 1>>2; //1向右位移两位
int b = -1>>2;
int c = 1 <<2;
int d = -1<<2;
int e = 3 >>>2;
//a,b,c,d,e结果是多少
System.out.println("a=" +a);
System.out.println("b=" +b);
System.out.println("c=" +c);
System.out.println("d=" +d);
System.out.println("e=" +e);
}
二、数(前后都是数)的位运算(~按位取反、&按位与、| 按位或、^按位异或)
1、按位与& : 两位全为 1 ,结果为 1 ,否则为0
2、按位或 | : 两位有一个为 1,结果为 1 ,否则为0
3、按位异或 ^ : 两位有一个为0,一个为1,结果为1,否则为0
4、按位取反~ :0 -> 1 , 1 -> 0
○都需要用到二进制的原码补码和反码来运算,特别要注意原码补码的规则。尤其是以下两点
1、在计算机运算的时候,都是以补码的方式来运算的。
2、当我们看运算结果的时候,要看他的原码。
例 1:~2 =? (对2按位取反)
①先得到2的补码(计算机以补码的方式运算)
②要得到补码就要知道原码和反码(正数的三码合一)
③原码:0000 0000 0000 0000 0000 0000 0000 0010
( 整型是4个字节,一个字节占8bit(位) )
④补码:0000 0000 0000 0000 0000 0000 0000 0010
⑤~取反:1111 1111 1111 1111 1111 1111 1111 1101
⑥取反后得到的是补码,需要再得到上述补码的原码。
先得到反码:(反码 = 补码 - 1)
1111 1111 1111 1111 1111 1111 1111 1100
再得到原码:
1000 0000 0000 0000 0000 0000 0000 0011
⑦所以得到对应的十进制结果为:-3
例 2 : -3 ^ 3(异或运算)
①先分别写出它们的原码:
-3:1000 0000 0000 0000 0000 0000 0000 0011
3: 0000 0000 0000 0000 0000 0000 0000 0011
== ②得到它们的反码,再得到补码:==
-3反码:1111 1111 1111 1111 1111 1111 1111 1100
-3补码:1111 1111 1111 1111 1111 1111 1111 1101
3: 0000 0000 0000 0000 0000 0000 0000 0011(三码合一)
③进行异或运算:
-3: 1111 1111 1111 1111 1111 1111 1111 1101
^
3: 0000 0000 0000 0000 0000 0000 0000 0011
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
结果:1111 1111 1111 1111 1111 1111 1111 1110
④运算后得到的是补码,此时还要算出它们的原码, 1开头为负数,所以先得到反码,再得到原码。(也可直接得到原码,取反+1即可)这里我们用 反码 = 补码 - 1,然后再取反。
得到结果为:
0000 0000 0000 0000 0000 0000 0000 0010
⑤对应的十进制为 2 ,所以结果为2。
ps:在进行按位与& 和按位或 | 时也是一样的步骤,记得位运算后的结果是补码,然后看正负再进行转换成原码,最后得到十进制的结果即可。
上一篇: 天梯赛倒数第n个字符串
下一篇: Adding Powers