JAVA进制等移位运算[参考于回钦波文库]

JAVA移位运算符

文章分类:Java编程

作者:回钦波 

    移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
  在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。

      386 以后的硬件把移位对字长进行取模,右移32位就是右移了0位(CPU 把右移的位数 32 对于字长 32 进行取模运算,得到 0),因此 9 右移 32 位仍然是 9。你可以换一下for循环的条件,比如换成i<=64,你会发现结果是一样的。

      三种移位运算符的移动规则和使用如下所示:
  <<运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
  语法格式:
  需要移位的数字 << 移位的次数
  例如: 3 << 2,则是将数字3左移2位
  计算过程:
  3 << 2
  首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12.数学意义:
   在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
  >>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1.
  语法格式:
  需要移位的数字 >> 移位的次数
  例如11 >> 2,则是将数字11右移2位
  计算过程:11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0010.转换为十进制是3.
   数学意义:右移一位相当于除2,右移n位相当于除以2的n次方。
  >>>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。
  其他结构和>>相似。
 
 
 
 
移位例2:
Java代码 复制代码  收藏代码
  1. // 左移: 向左移动,右边补0   
  2. for (int i = 0;i < 8 ;i++)     
  3.     System.out.print( (1 << i) + " ");   
  4. output   
  5. 1 2 4 8 16 32 64 128    
  6.   
  7. // 右移: 向右移动,如果符号位(int型为32位)为0,左边补0,符号位为1,左边补1   
  8. // 符号位为1的右移   
  9. for (int i = 0;i < 8 ;i++)     
  10.     System.out.print( Integer.toHexString(0x40000000 >> i) + " ");   
  11. output   
  12. 40000000 20000000 10000000 8000000 4000000 2000000 1000000 800000    
  13. 回钦波为您详细分析---其实这里的运算过程是这样的:
  14. 1.  0x代表是16进制,暂且不用管它,现在不影响
  15. 2.  40000000 要分解至二进制
  16.      4:0100
  17.        0:0000
  18.          0:0000
  19.            0:0000
  20.              0:0000
  21.                0:0000
  22.                  0:0000
  23.                    0:0000
  24.       也就是把40000000 转化为二进制后的结果是:0100 0000 0000 0000 0000 0000 0000 0000
  25. 3.开始移位:因为是右移,for循环第二次i为1,也就是在40000000 前加一个0,结果是 :
  26.                                                                                   0010 0000 0000 0000 0000 0000 0000 0000
  27.                                                                                      最终结果为:20000000 
  28. 4.开始移位:因为是右移,所以for循环第二次i为2,也就是在40000000 前加一个0,结果是 :
  29.                                                                                   0001 0000 0000 0000 0000 0000 0000 0000
  30.                                                                                      最终结果为:10000000 
  31. 依次是这样算法,,。
  32.   
  33. // 符号位为1的右移   
  34. // 最高4位为1000, 右移1位,变成1100也就是c,   
  35. for (int i = 0;i < 8 ;i++)     
  36.     System.out.print( Integer.toHexString(0x80000000 >> i) + " ");   
  37. output   
  38. 80000000 c0000000 e0000000 f0000000 f8000000 fc000000 fe000000 ff000000  
// 左移: 向左移动,右边补0
for (int i = 0;i < 8 ;i++)  
	System.out.print( (1 << i) + " ");
output
1 2 4 8 16 32 64 128 

// 右移: 向右移动,如果符号位(int型为32位)为0,左边补0,符号位为1,左边补1
// 符号位为1的右移
for (int i = 0;i < 8 ;i++)  
	System.out.print( Integer.toHexString(0x40000000 >> i) + " ");
output
40000000 20000000 10000000 8000000 4000000 2000000 1000000 800000 

// 符号位为1的右移
// 最高4位为1000, 右移1位,变成1100也就是c,
for (int i = 0;i < 8 ;i++)  
	System.out.print( Integer.toHexString(0x80000000 >> i) + " ");
output
80000000 c0000000 e0000000 f0000000 f8000000 fc000000 fe000000 ff000000

上面的通用法则没有错,但是有一个限制,对int型,移位的位数不超过32,对long型,移位的位数不超过64。现在进行如下测试:
Java代码 复制代码  收藏代码
  1. System.out.println(Integer.toHexString(0x80000000 >> 31));   
  2. // output: ffffffff   
  3. System.out.println(Integer.toHexString(0x80000000 >> 32));   
  4. // output: 80000000  
System.out.println(Integer.toHexString(0x80000000 >> 31));
// output: ffffffff
System.out.println(Integer.toHexString(0x80000000 >> 32));
// output: 80000000

0x80000000在右移31位后,每个位都成了1(也就是-1),按照这个想法,右移32位理所当然的还是-1,可是右移32位后,得到的结果却又这个数本身。

通过对int,long类型数据左右移进行测试,发现:
java对移位运算"a <<||>> b"的处理,首先做 b mod 32||64运算, 如果a是int型,取mod 32,如果a是double型,取mod 64,然后再使用上面提到的通用移位运算规则进行移位。

以上是我今天遇到的问题,如果您想更多交流,更多学习请联系QQ:444084929【回钦波】

你可能感兴趣的:(java,编程)