您的位置:首页 > 编程语言 > Java开发

java中的位运算

2016-08-04 00:00 148 查看
摘要: 位运算,左移,右移。

位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算。位运算符可以分为逻辑运算符(包括~、&、|和^)及移位运算符(包括>>、<<和>>>)。

1)左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。

2)“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。若值为正,则在高位插入0;若值为负,则在高位插入1。

3)Java也添加了一种“无符号”右移位运算符(>>>),无论正负,都在高位插入0。这一运算符是C或C++没有的。

4)若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。 只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。 若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。 但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。 它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。

在进行位运算时,需要注意以下几点。   

(1)>>>和>>的区别是:在执行运算时,>>>运算符的操作数高位补0,而>>运算符的操作数高位移入原来高位的值。   

(2)右移一位相当于除以2,左移一位(在不溢出的情况下)相当于乘以2;移位运算速度高于乘除运算。 x* 2^n 相当于 x<< n , x / 2^n 相当于 x >> n

(3)若进行位逻辑运算的两个操作数的数据长度不相同,则返回值应该是数据长度较长的数据类型。   

(4)按位异或可以不使用临时变量完成两个值的交换,也可以使某个整型数的特定位的值翻转。   

(5)按位与运算可以用来屏蔽特定的位,也可以用来取某个数型数中某些特定的位。   

(6)按位或运算可以用来对某个整型数的特定位的值置l。

3.位运算符的优先级  

~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|。

二, 按位异或运算符^

参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0

例如:10100001^00010001=10110000

   0^0=0,0^1=1 0 异或任何数=任何数

   1^0=1,1^1=0 1 异或任何数-任何数取反

   任何数异或自己=把自己置0

(1)按位异或可以用来使某些特定的位翻转,如对数10100001的第2位和第3位翻转,可以将数与00000110进行按位异或运算。                     10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6

(2)通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。

例如交换两个整数a,b的值,可通过下列语句实现:

a=10100001,b=00000110

a=a^b;   //a=10100111

b=b^a;   //b=10100001

a=a^b;   //a=00000110

(3)异或运算符的特点是:数a两次异或同一个数b(a=a^b^b)仍然为原值a.

int a = 4;
int b = 5;
a = a ^ b;
b = b ^ a;
a = a ^ b;
System.out.println(a + ":"+ b);//5:4
System.out.println(a ^ a);//0
System.out.println(5 ^ 4 ^ 4);//5

以下是位运算的应用:

判断 int 型变量 a 是奇数还是偶数
a & 1 = 0 偶数
a & 1 = 1 奇数

乘法运算采用位运算实现
a * (2^n) 等价于 a << n

除法运算转化成位运算
a / (2^n) 等价于 a>> n

求相反数
(~x+1)

a % 2 等价于 a & 1

求绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: