C语言中逻辑操作符的巧妙用法

C语言中逻辑操作符的巧妙用法

1、循环左移

int型变量循环左移k次,即a = a<<k | a>>16-k  (设sizeof(int)=16) 

2、循环右移

int型变量a循环右移k次,即a = a>>k | a<<16-k  (设sizeof(int)=16) 

3、整数平均值

int average(int x, int y)  //返回X,Y 的平均值 
{    
    return (x&y)+((x^y)>>1); 
} 

5、判断整数是否是2的幂

对于一个数 x >= 0,判断他是不是2的幂 
boolean power2(int x) 
{ 
    return ((x&(x-1))==0)&&(x!=0); 
} 

6、不用temp交换两个整数

void swap(int x , int y) 
{ 
    x ^= y; 
    y ^= x; 
    x ^= y; 
} 

7、计算绝对值

int abs( int x ) 
{ 
    int y ; 
    y = x >> 31 ; 
    return (x^y)-y ;        //or: (x+y)^y 
} 

8、取模运算转化成位运算 (在不产生溢出的情况下)

a % (2^n) 等价于 a & (2^n - 1) 

9、乘法运算转化成位运算 (在不产生溢出的情况下)

a * (2^n) 等价于 a < < n

10、除法运算转化成位运算 (在不产生溢出的情况下)

a / (2^n) 等价于 a>> n 
        例: 12/8 == 12>>3 

11、等价

a % 2 等价于 a & 1 

12、等价

 if (x == a) x= b; 
            else x= a; 
        等价于 x= a ^ b ^ x; 

13、相反数

 x 的 相反数 表示为 (~x+1)

14、求从x位(高)到y位(低)间共有多少个1

public static int FindChessNum(int x, int y, ushort k) 
{ 
    int re = 0; 
    for (int i = y; i <= x; i++) 
    { 
        re += ((k >> (i - 1)) & 1); 
    } 
    return re; 
} 

15、/将32位数分解为4个8位数处理后再合成32位数返回/

DWORD GetDW(DWORD dw)
{
    DWORD dwRet=0;
    if (dw!=0)
    {
        BYTE b1=(dw>>24)&0xff,b2=(dw>>16)&0xff,b3=(dw>>8)&0xff,b4=dw&0xff;
    //分别处理 b1,b2,b3,b4
        dwRet=b1;
        dwRet=(dwRet<<8)+b2;
        dwRet=(dwRet<<8)+b3;
        dwRet=(dwRet<<8)+b4;
        return dwRet;
    }
    else{
        return 0;
    }
}

16、检测一个无符号数是不为2^n-1(^为幂)

x&(x+1)

17、将最右侧0位改为1位

x = x | (x+1) 

18、 二进制补码运算公式

  -x   =   ~x   +   1   =   ~(x-1)   
  ~x   =   -x-1     
  -(~x)   =   x+1   
  ~(-x)   =   x-1   
  x+y   =   x   -   ~y   -   1   =   (x|y)+(x&y)     
  x-y   =   x   +   ~y   +   1   =   (x|~y)-(~x&y)     
  x^y   =   (x|y)-(x&y)   
  x|y   =   (x&~y)+y   
  x&y   =   (~x|y)-~x   

  x==y:         ~(x-y|y-x)   
  x!=y:         x-y|y-x   
  x<   y:         (x-y)^((x^y)&((x-y)^x))   
  x<=y:         (x|~y)&((x^y)|~(y-x))   
  x<   y:         (~x&y)|((~x|y)&(x-y))//无符号x,y比较   
  x<=y:         (~x|y)&((x^y)|~(y-x))//无符号x,y比较   

19、 符号函数

  int   sign(int   x)   
  {   
      return   (x>>31)   |   (unsigned(-x))>>31   ;//x=-2^31时失败(^为幂)   
  }   

20、三值比较

  int   cmp(   int   x,   int   y   )   
  {   
      return   (x>y)-(x-y)   ;   
  }   

21、不使用第三方交换x,y

  1.x   ^=   y   ;   y   ^=   x   ;   x   ^=   y   ;   
  2.x   =   x+y   ;   y   =   x-y   ;   x   =   x-y   ;   
  3.x   =   x-y   ;   y   =   y+x   ;   x   =   y-x   ;   
  4.x   =   y-x   ;   x   =   y-x   ;   x   =   x+y   ;     

22、最大值

int   max(int   x,   int   y   )     
{   
    int   m   ;   
    m   =   (x-y)>>31   ;     
    return   y   &   m   |   x   &   ~m   ;   
}  

23、将最右侧1变为0

n = n & (n - 1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值