使用基本运算操作实现基本位运算

本文详细介绍了C语言中的一系列函数,包括清除最低有效位(LSB)、字节取反、字节异或、逻辑与、逻辑或、循环左移、奇偶校验、乘法判断、整数除法、减法判断、绝对值以及浮点数处理,展示了位操作在编程中的应用。
  1. lsbZero

将x的最低有效位(LSB)清零

int lsbZero(int x) {
  x>>=1;
  x<<=1;
  return x;
}  
int lsbZero(int x) {
 x&=0xfffffffe; 
 return x;
}  
int lsbZero(int x) {
 return x&(~1);
}   
  1. byteNot

将x的第n个字节取反(字节从LSB开始到MSB依次编号为0-3)

int byteNot(int x, int n) {
   int a=0xff;
   a<<=(n<<3); 
   return x^a;
}   
  1. byteXor

比较x和y的第n个字节(字节从LSB开始到MSB依次编号为0-3),若不同,则返回1;若相同,则返回0

int byteXor(int x,int y,int n){ 
 x>>=(n<<3);
 x&=0xff; 
 y>>=(n<<3);
 y&=0xff; 
 return !!(x^y);   
}   
  1. logicalAnd

x&& y

 int logicalAnd(int x, int y) {
   return (!!x)&(!!y);
}
 int logicalAnd(int x, int y) {
  return (((x|(~x+1))>>31)&0x1)&(((y|(~y+1))>>31)&0x1);
}
  1. logicalOr

x|| y

int logicalOr(int x, int y){
return ((x | ~x + 1) | (y | ~y + 1)) >> 31 & 1;
}
int logicalAnd(int x, int y) {
   return (!!x)|(!!y);
}
  1. rotateLeft

将x循环左移n位

int rotateLeft(int x, int n) {
int copy = x;
int ux = x;
ux >>= (32 + ~n+1);
ux <<= (32 + ~n+1);
copy <<= n;
copy >>= n;
copy <<= n;
ux>>=1;
ux&=((1<<31)+~1+1);
ux >>= (32 +~n);
return (copy | ux);
} 
int rotateLeft(int x, int n) {
int m=~0; 
m<<=n;
m>>=n;
m~=m; 
m&=x;
m>>=(32+(~n+1));
return (x<<n)|m;
}
  1. parityCheck

若x有奇数个1,则返回1;否则,返回0

int parityCheck(int x) {
int copy=x;
copy>>=16;
x~=copy;
copy>>=8;
x~=copy;
copy>>=4; 
x~=copy;
copy>>=2; 
x~=copy;
copy>>=1;
x~=copy; 
return x&1; 
}
int parityCheck(int x) {
x~=(x>>16);
x~=(x>>24);
x~=(x>>28);  
x~=(x>>30);
x~=(x>>31); 
return x&1;
}
  1. mul2OK

计算2*x,如果不溢出,则返回1,否则,返回0

int mul2OK(int x) {
  return 1^(((x>>31)&1)^((x>>30)&1));
}
  1. mult3div2

计算(x*3)/2,朝零方向取整

int mult3div2(int x) {
x=(x<<1)+x; 
return (x>>1)+((x>>31)&(x&1));   
}
int mult3div2(int x) {
        x=(x<<1)+x;
        return (((x>>31)&1)+x)>>1;
}
  1. subOK

计算x –y,如果不溢出,则返回1,否则,返回0

int subOK(int x, int y) {
int sub=x+~y+1; 
return (sub>>31)^(x>>31); 
}   
  1. absVal

求x的绝对值

int absVal(int x) { 
return ((x>>31)&(~x+1))|(~(x>>31)&x);
}  
  1. float_abs

返回浮点数‘|f|’的二进制表示,当输入参数是NaN时,返回NaN

unsigned float_abs(unsigned uf) {
    unsigned exp = (uf >> 23) & 0xFF;
    unsigned frac = uf & 0x7FFFFF;
    if (exp == 0xFF && frac != 0) {
        return uf;
    }
    return (((uf>>31)&1)<<31)^uf;
}
  1. float_abs

返回浮点数‘f’的强制整型转换“(int)f”表示

int float_f2i(unsigned uf) {
    unsigned exp=(uf>>23)&0xff;
    unsigned frac=uf&0x7fffff;
    int sign=((uf>>31)==0)?1:-1;

    if(exp==0xff)
    {
    return 0x80000000;
    }
    if(exp<127)
    {
    return 0;
    }
    if(exp>=158)
    {
    return 0x80000000;
    } 
    frac=frac|0x800000;
    int result=0;   
    if(exp<150) 
    {
    result=frac>>(150-exp);   
    }
    else
    {
    result=frac<<(exp-150);
    }
    return sign*result; 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值