`
qifan.yang
  • 浏览: 52150 次
社区版块
存档分类
最新评论

java位运算

    博客分类:
  • java
 
阅读更多
在网上收集位运算,自己总结下:

原码 , 反码 ,补码

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

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

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

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

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


java中的取反运算
例一:
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 。



Java中的位移运算
“>> 右移”;“<< 左移”;“>>> 无符号右移”

“>>”运算符作带符号的位移处理,它作位移处理时,会先将值向右移,并在高位填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

Java中的位逻辑运算符
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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics