- 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);
}
- byteNot
将x的第n个字节取反(字节从LSB开始到MSB依次编号为0-3)
int byteNot(int x, int n) {
int a=0xff;
a<<=(n<<3);
return x^a;
}
- 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);
}
- 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);
}
- 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);
}
- 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;
}
- 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;
}
- mul2OK
计算2*x,如果不溢出,则返回1,否则,返回0
int mul2OK(int x) {
return 1^(((x>>31)&1)^((x>>30)&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;
}
- subOK
计算x –y,如果不溢出,则返回1,否则,返回0
int subOK(int x, int y) {
int sub=x+~y+1;
return (sub>>31)^(x>>31);
}
- absVal
求x的绝对值
int absVal(int x) {
return ((x>>31)&(~x+1))|(~(x>>31)&x);
}
- 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;
}
- 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;
}
本文详细介绍了C语言中的一系列函数,包括清除最低有效位(LSB)、字节取反、字节异或、逻辑与、逻辑或、循环左移、奇偶校验、乘法判断、整数除法、减法判断、绝对值以及浮点数处理,展示了位操作在编程中的应用。

1643

被折叠的 条评论
为什么被折叠?



