原码、反码、补码和位运算

原码、补码、反码和位运算

一、对于有符号的而言:(以下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:在进行按位与& 和按位或 | 时也是一样的步骤,记得位运算后的结果是补码,然后看正负再进行转换成原码,最后得到十进制的结果即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值