[关闭]
@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.按位与(And)

通过&可以实现判断奇偶数,对于奇数的二进制表示最后一位一定为1,而偶数为0

  1. publci boolean isOdd(int i){
  2. flag=true;
  3. if (i&1){
  4. flag=false;
  5. }
  6. return flag;
  7. }

通过与运算可以判断第i为是为1

  1. publci boolean is(int i){
  2. return i&00001000;
  3. //也可以和取反,移位运算结合在一起
  4. //return i&(1<<k);//判断第k位是否为1
  5. }

2.按位异或

可以利用异或满足交换律和任何数与自身异或为0,和与0异或为自身,来实现不使用中间值来交换数据

  1. public void swap(int aint b){
  2. if(a!=b){
  3. a=a^b;
  4. b=a^b;
  5. a=a^b;
  6. }
  7. }

3.取反

通过取反加1实现正负数的转换

  1. public int signResver(int i){
  2. return ~i+1;
  3. }

通过取反实现求绝对值,首先通过移位获得符号位,为1是为负数返回正数

  1. public int abs(int i){
  2. return i>>31==0 ? i:~i+1
  3. }

利用异或的特性任何数与0异或为自身,与-1异或相当于取反

  1. public int abs(int i){
  2. int flag=i>>31;//获得符号位
  3. return (a^flag)-flag;//与符号位异或,当符号位为0是相当于自身,当为-1是相当于取反,-(-1)即加1
  4. }

4.按位或

通过或运算在指定为置1

  1. i|=(1<<k)//将i的第K位置1

移位运算

1.高低位交换
利用移位运算将高位或低位全部置为0,然后利用或运算

  1. public void swapBinary(int i){
  2. int i;//java int为32位
  3. i=(i>>16)|(i<<16);
  4. }

2.计算平方

  1. public void su(int k){
  2. int i=0;
  3. int sum=0;
  4. while(i<31){//int 为32位
  5. if((k&(1<<i))>0){//将乘法转换为加法,当k=9时 二进制位00001001 ,通过与运算确定第几位需要计算
  6. sum+=(k<<i);//k<<i 代表k的乘以2^i
  7. }
  8. i++;
  9. }
  10. }

3.计算一个数二进制有几个1

  1. //根据奇偶数的不同,奇数最后一位为1
  2. int k=255,k1=127;
  3. int sum1=0,sum2=0;
  4. while(k>0){
  5. if(k%2==1){
  6. sum1++;
  7. }
  8. k=k/2;
  9. }
  10. while(k1>0){
  11. sum2+=(k1&1);
  12. k1>>=1;
  13. }

本文参考MoreWindows

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注