Java - 原码、反码、补码、&、|、^、~、>>、<<等

原码

正数:将其绝对值转换为二进制数,即为原码
负数:将其绝对值转换为二进制数,最高位 (符号位) 补1,即为原码

反码

正数:与原码相同
负数:该数的原码,除符号位,其余取反(0->1 1->0)。

补码

正数:与原码、反码相同
负数:该数的原码,除符号位,其余取反(0->1 1->0),最后 1 位 加 1。

十进制:	201 
二进制原码: 00000000 00000000 00000000 11001001
二进制反码: 00000000 00000000 00000000 11001001
二进制补码: 00000000 00000000 00000000 11001001

十进制:	-201 
二进制原码: 10000000 00000000 00000000 11001001
二进制反码: 11111111 11111111 11111111 00110110
二进制补码: 11111111 11111111 11111111 00110111

十进制: 171 
二进制原码: 00000000 00000000 00000000 10101011
二进制反码: 00000000 00000000 00000000 10101011
二进制补码: 00000000 00000000 00000000 10101011

十进制: -171
二进制原码: 10000000 00000000 00000000 10101011
二进制反码: 11111111 11111111 11111111 01010100
二进制补码: 11111111 11111111 11111111 01010101

与运算(&)

     同为1为1,否则为0 (0&0=0、0&1=0 、 1&0=0 、1&1=1)

     注:负数,需要先转换成补码,将计算后的补码,再进行转换回去

int res1 = 201 & 171;	// 结果为:十进制137
int res2 = 201 & -171;	// 结果为:十进制65

	00000000 00000000 00000000 11001001       201的补码
&   00000000 00000000 00000000 10101011       171的补码
---------------------------------------
    00000000 00000000 00000000 10001001       正数137

	00000000 00000000 00000000 11001001       201的补码
&   11111111 11111111 11111111 01010101       -171的补码
---------------------------------------
    00000000 00000000 00000000 01000001       正数65

或运算(|)

     同为0,才为0,否则为1(0&0=0、0&1=1 、1&0=1、1&1=1)

     注:负数,需要先转换成补码,将计算后的补码,再进行转换回去

int res1 = 201 | 171;	// 结果为:十进制235
int res2 = 201 | -171;	// 结果为:十进制-35

    00000000 00000000 00000000 11001001       201的补码
|   00000000 00000000 00000000 10101011       171的补码
---------------------------------------
    00000000 00000000 00000000 11101011       正数235

    00000000 00000000 00000000 11001001       201的补码
|   11111111 11111111 11111111 01010101       -171的补码
---------------------------------------
    11111111 11111111 11111111 11011101      补码     
	11111111 11111111 11111111 11011100      反码
	10000000 00000000 00000000 00100011      原码
	-35                                      负数 

异或运算(^)

     不同为1,否则为0(0&0=0、0&1=1 、1&0=1、1&1=0)

     这里是进行的反转操作,n 和 1 进行异或运算,会反转

     注:负数,需要先转换成补码,将计算后的补码,再进行转换回去

int res1 = 201 ^ 171;	// 结果为:十进制 98
int res2 = 201 ^ -171;	// 结果为:十进制 -100

    00000000 00000000 00000000 11001001       201的补码
^   00000000 00000000 00000000 10101011       171的补码
---------------------------------------
    00000000 00000000 00000000 01100010       98的补码

    00000000 00000000 00000000 11001001       201的补码
^   11111111 11111111 11111111 01010101       -171的补码
---------------------------------------
    11111111 11111111 11111111 10011100      补码
	11111111 11111111 11111111 10011011      反码
	10000000 00000000 00000000 01100100      原码
	-100                                     负数

取反(~)

     对每一位进行取反

     注:负数,需要先转换成补码,将计算后的补码,再进行转换回去

int res1 = ~201;	// 结果为:十进制 -202
int res2 = ~ -201;	// 结果为:十进制 200

    ~ 00000000 00000000 00000000 11001001       201的补码
-------------------------------------------
      11111111 11111111 11111111 00110110       补码
      11111111 11111111 11111111 00110101       反码
	  10000000 00000000 00000000 11001010       原码
	  -202                                      负数

    ~ 11111111 11111111 11111111 00110111       -201的补码
-------------------------------------------
      00000000 00000000 00000000 11001000       补码
      00000000 00000000 00000000 11001000       反码
	  00000000 00000000 00000000 11001000       原码
	  200                                       正数

左移( << )

     左移若干位,右边补0
     每左移一位,相当于乘以2

int res1 = 10 << 2;	// 结果为:十进制 40
int res2 = -10 << 2;	// 结果为:十进制 -40

10 << 2
00000000 00000000 00000000 00001010 << 2
---------------------------------
00000000 00000000 00000000 00101000     正数40

负数:-10
10000000 00000000 00000000 00001010 原码
11111111 11111111 11111111 11110101 反码
11111111 11111111 11111111 11110110 补码

-10 << 2
11111111 11111111 11111111 11110110 << 2
---------------------------------
11111111 11111111 11111111 11011000 补码
11111111 11111111 11111111 11010111 反码
10000000 00000000 00000000 00101000 原码
-40                                 负数

带符号右移 ( >> )

     右移若干位,正数左边补0,负数左边补1

int res1 = 10 >> 6;	    // 结果为:十进制 0
int res2 = -10 >> 6;	// 结果为:十进制 -1

10 >> 6
00000000 00000000 00000000 00001010 >> 6
---------------------------------
00000000 00000000 00000000 00000000    正数0


十进制:-10
二进制原码: 10000000 00000000 00000000 00001010 
二进制反码: 11111111 11111111 11111111 11110101 
二进制补码: 11111111 11111111 11111111 11110110 

-10 >> 6
11111111 11111111 11111111 11110110 >> 6
---------------------------------
11111111 11111111 11111111 11111111 补码
11111111 11111111 11111111 11111110 反码
10000000 00000000 00000000 00000001 原码
-1                                  负数

无符号右移( >>> )

     右移若干位,无论正数或负数,左边都补0

int res1 = 10 >>> 6;	// 结果为:十进制 0
int res2 = -10 >>> 6;	// 结果为:十进制 67108863

10 >> 6
00000000 00000000 00000000 00001010 >> 6
---------------------------------
00000000 00000000 00000000 00000000    正数0


十进制:-10
二进制原码: 10000000 00000000 00000000 00001010 
二进制反码: 11111111 11111111 11111111 11110101 
二进制补码: 11111111 11111111 11111111 11110110 

-10 >> 6
11111111 11111111 11111111 11110110 >> 6
---------------------------------
00000011 11111111 11111111 11111111 补码
00000011 11111111 11111111 11111111 反码
00000011 11111111 11111111 11111111 原码
67108863                            正数

在线进制转换工具

进制转换工具:https://tool.oschina.net/hexconvert

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值