Java中的位运算

来源:互联网 发布:剑网三叶芷青数据 编辑:程序博客网 时间:2024/05/16 00:27

要搞清楚移位运算,首先要搞清楚字节数。Jvm保证了原始类型的字节数不受操作系统影响,无论是16位,32位或64位操作系统。
boolean 1 位,char 16 位 我们常说的一个字符占两个字节,byte 8 位 即一个字节short 16 位,int 32 位,long 64 位,float 32 位,double 64 位。
一般数值都是带符号的,从左往右数,数值类型的第一位是表示正负的,0为正1为负。

*要获得一个负数的二进制表示:用正数值按位取反再加一(注意这里的加一不是负数计算中的加一,就是正数的加一)表示负数值。例如int i=1;实际上就是:
0….00001(int是32位,前面有31个0),而-1实际上是1按位取反::1….11110(31个1)::再加一::1….1111(32个1)
*要获得一个负数形式的二进制表示的十进制值,也是除了第一位符号位外其它位都按位取反再加一,然后加上负号。

弄清楚了各种类型的字节数已经正负符号,所有的位运算操作符就变得简单了。

一、按位运算:对二进制位(bit)进行布尔代数,并得到结果。

  1. 按位运算一般来说只处理整数。(short,int,long)。如果一个小类型与一个大类型运算,小类型自动补齐大类型所需要的位数。
  2. &两个bit都是1,则结果是1,否则都是0。-1&1=1
  3. |两个bit都是0,则结果是0,否则都是1。-1|1=-1
  4. 异或^两个bit不一样,则结果是1,否则是0。-1^1=-2
  5. 非~,只对一个bit进行运算。~-1=0

二.移位运算 将二进制向一个方向移动给出的位数。

  1. a<<2,表示将a的二进制表示向左移动两位,低位补0。在没移出去的情况下(要是int类型左移32,那就完全移出去了,得到32个0),左移一位表示乘以2。
  2. a>>10表示向右移动十位,若a为正,则高位补0,若为负则补1。 右移不存在移出去的问题,右移就表示除以2取整。
  3. >>>无论正负高位都补0。

位运算可以用来做Hash
static int hash(int paramInt)
{
paramInt ^= paramInt >>> 20 ^ paramInt >>> 12;
return (paramInt ^ paramInt >>> 7 ^ paramInt >>> 4);
}
现在应该能看懂这个hash函数在干嘛了吧。

0 0