java位运算

在网上收集位运算,自己总结下:

原码 , 反码 ,补码

原码:原码是指将最高位作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值的数字表示方式。

反码:如果是正数,则表示方法和原码一样;如果是负数,则保留符号位1,然后将这个数字的原码按照每位取反,则得到这个数字的反码表示形式

补码:补码是计算机表示数据的一般方式,其规则为:如果是正数,则表示方法和原码一样;如果是负数,则将数字的反码加上1(相当于将原码数值位取反然后在最低位加1)。

正如数电课本上讲的正数的原码 ,反码 ,补码一样。

将原码每个位取反得到反码,(注意这里符号位不取反,因为正数原码反码一样,负数反码保留符号位1
,所以这里忽略符号位)


[b][color=red]java中的取反运算[/color][/b]
例一:
int x = 10 ;
原码表示:00000000000000000000000000001010(32位,首位表示符号位,1:表示为负数,0:表示为正数)。

~x:取反运算,包括符号位都取反,反码表示:11111111111111111111111111110101,十进制为-11

分析:
第一:x = 10 ,计算机存储的是补码,因正数的原码,反码,补码一样,所以计算机中存储【00000000000000000000000000001010】;
第二:取反运算~x,直接对存储的【00000000000000000000000000001010】进行运算,得到【11111111111111111111111111110101】;
第三:由补码到原码的运算,补码-1=反码 ;
【11111111111111111111111111110101】-1=【11111111111111111111111111110100】,
反码取反等于原码
~【11111111111111111111111111110100】=【10000000000000000000000000001011】=-11

例二:
int x = -10 ;

原码:【100000000000000000000000000001010】
反码:【11111111111111111111111111110101】
补码:【11111111111111111111111111110110】
计算机中存储的是补码;
取反:【000000000000000000000000001001】
因首位为0,是正数,补码,反码,原码一样,所以结果为9 。


[b][color=red]Java中的位移运算[/color][/b]
“>> 右移”;“<< 左移”;“>>> 无符号右移”

“>>”运算符作带符号的位移处理,它作位移处理时,会先将值向右移,并在高位填0,然后将位移后所空出的高位,全部改成原来的最高位的值(代表正负号的位)。也就是说负的值位移后,仍然是负的值。

“>>>”运算符所作的是无符号的位移处理,它不会将所处理的值的最高位视为正负符号,所以作位移处理时,会直接在空出的高位填入0。当我们要作位移的原始值并非代表数值时(例如:表示颜色图素的值,最高位并非正负号),可能就会需要使用此种无符号的位移。

“>>”运算符的所作的也是无符号的位移处理,同样地,它不会将所处理的值的最高位视为正负符号,它作位移处理时,会直接左移并在低位填入0。所以第二高位以下的位若移到了最高位,该值的正负可能会与原来的不同。

例一:
-5>>3=-1
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1111 1111
其结果与 Math.floor((double)-5/(2*2*2)) 完全相同。
-5<<3=-40
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1101 1000
其结果与 -5*2*2*2 完全相同。
5>>3=0
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0000
其结果与 5/(2*2*2) 完全相同。
5<<3=40
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0010 1000
其结果与 5*2*2*2 完全相同。
-5>>>3=536870911
1111 1111 1111 1111 1111 1111 1111 1011
0001 1111 1111 1111 1111 1111 1111 1111
无论正数、负数,它们的右移、左移、无符号右移 32 位都是其本身,比如 -5<<32=-5、-5>>32=-5、-5>>>32=-5。
一个有趣的现象是,把 1 左移 31 位再右移 31 位,其结果为 -1。
0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111

[color=red][b]Java中的位逻辑运算符[/b][/color]
5&3=1,遇0为0
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0001

5|3=7 遇1为1
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0111

-5^3=-8 不同则为1,“^ 异或”是一种特殊的逻辑运算,对它求反可以得到“同或”,所以“同或”逻辑也叫“异或非”逻辑
1111 1111 1111 1111 1111 1111 1111 1011
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值