@867976167
2014-11-17T23:39:28.000000Z
字数 1292
阅读 2576
位操作
位操作是对位模式按位和二进制数的一元和二元操作,对于现在的处理器位运算与加法相同,但快于乘法。在程序设计中可以通过位运算来简化操作。位操作有:位运算符和移位
运算符 | 描述 | 运算规则 |
---|---|---|
& | 按位与 | 两个都为1才是1 |
| | 按位或 | 有一个为1即为1,两个全是0才为0 |
^ | 按位异或 | 两位不同为1 相同为0 |
~ | 取反 | 0变1,1变0 单目运算符 |
>> | 算术右移 | 各二进制位右移若干单位,无符号数高位补0,有符号数补符号位 |
<< | 算术左移 | 各二进制位左移若干单位,高位丢弃,低位补0,相当于乘法 |
>>> | 逻辑右移 | 各二进制位右移若干单位,高位补0。 java中的无符号右移 |
通过&可以实现判断奇偶数,对于奇数的二进制表示最后一位一定为1,而偶数为0
publci boolean isOdd(int i){
flag=true;
if (i&1){
flag=false;
}
return flag;
}
通过与运算可以判断第i为是为1
publci boolean is(int i){
return i&00001000;
//也可以和取反,移位运算结合在一起
//return i&(1<<k);//判断第k位是否为1
}
可以利用异或满足交换律和任何数与自身异或为0,和与0异或为自身,来实现不使用中间值来交换数据
public void swap(int a,int b){
if(a!=b){
a=a^b;
b=a^b;
a=a^b;
}
}
通过取反加1实现正负数的转换
public int signResver(int i){
return ~i+1;
}
通过取反实现求绝对值,首先通过移位获得符号位,为1是为负数返回正数
public int abs(int i){
return i>>31==0 ? i:~i+1
}
利用异或的特性任何数与0异或为自身,与-1异或相当于取反
public int abs(int i){
int flag=i>>31;//获得符号位
return (a^flag)-flag;//与符号位异或,当符号位为0是相当于自身,当为-1是相当于取反,-(-1)即加1
}
通过或运算在指定为置1
i|=(1<<k)//将i的第K位置1
1.高低位交换
利用移位运算将高位或低位全部置为0,然后利用或运算
public void swapBinary(int i){
int i;//java int为32位
i=(i>>16)|(i<<16);
}
2.计算平方
public void su(int k){
int i=0;
int sum=0;
while(i<31){//int 为32位
if((k&(1<<i))>0){//将乘法转换为加法,当k=9时 二进制位00001001 ,通过与运算确定第几位需要计算
sum+=(k<<i);//k<<i 代表k的乘以2^i
}
i++;
}
}
3.计算一个数二进制有几个1
//根据奇偶数的不同,奇数最后一位为1
int k=255,k1=127;
int sum1=0,sum2=0;
while(k>0){
if(k%2==1){
sum1++;
}
k=k/2;
}
while(k1>0){
sum2+=(k1&1);
k1>>=1;
}
本文参考MoreWindows