java位移运算
异或^:
0110 ^ 0011 = 0101
与&:
0110 & 0011 = 0010
或| :
0110 | 0011 = 0111
非~(取负数减1,如~1=-2,~2=-3,~(-2)=1):
~0110 = 1001
判断int型变量a是奇数还是偶数
a&1 = 0 偶数
a&1 = 1 奇数
求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以使用位运算。
(x&y)+((x^y)>>1);
将x和y拆成两部分的平均值相加:
x、y对应位相同部分,x、y对应位不同部分。
x&y计算的是两个数用二进制表示时对应位相同的部分的平均,由于是取平均,所以若对应位相同则取其中一个数即可,所以用与操作;
x^y>>1计算的是对应位不同的部分的平均,也就是一个是0一个是1,那么平均就是(0+1)/2,就是异或并移位
(右移一位,相当于除以2)的结果。
举一个十进制的例子:
计算14和6的平均值,拆分数字:14=6+8,6=6+0.相同部分两个6,取一个,不同部分8和0,取(8+0)/2=4。那么结果就是6+4=10就是所要求的答案。
对于一个大于0的整数,判断它是不是2的几次方
((x&(x-1))==0)&&(x!=0);
比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效
x ^= y;
y ^= x;
x ^= y;
求绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y or x >> 31 == 0 ? x : (~x + 1)
}
x>>31是考虑到x有可能为负数的情况,因为负数高位是1开始,正数是0开始,右移31就是取高位.所以y的值不是0就是-1.
取模运算,采用位运算实现:
a % (2^n) 等价于 a & (2^n - 1)
乘法运算 采用位运算实现
a * (2^n) 等价于 a << n
除法运算转化成位运算
a / (2^n) 等价于 a>> n
求相反数
(~x+1)
a % 2 等价于 a & 1
十进制转二进制:
一. 除基倒取余法:
public void binaryToDecimal( int n){
int t = 0; //用来记录位数 3 int bin = 0; //用来记录最后的二进制数 4 int r = 0; //用来存储余数
while (n != 0){
r = n % 2;
n = n / 2;
bin += r * Math.pow(10,t);
t++;
}
System.out.println(bin);
}
二. 利用"移位"操作实现
public void binaryToDecimal(int n){
StringBuffer str = new StringBuffer();
for ( int i = 31;i >= 0; i--)
str = str.append(n >>> i & 1);
System.out.println(str.toString());
}
三.调用API函数
public void function1( int n){
String result = Integer.toBinaryString(n);
System.out.println(result);
}