C语言提供了6个用于位操作的运算符,这些运算符只能作用于整数分量,即只能作用于有符号和无符号的char、short、int和long类型。
& —— 屏蔽某些位
| —— 打开某些位
^ —— 在两个运算分量的对应位不相同时置该位为1,否则,置该位为0。
<< —— 将左运算分量左移由右运算分量所指定的位数
>> —— 将左运算分量右移由右运算分量所指定的位数
~ —— 求整数的反码
Tips:
1. 我们常用移位取反等操作的组合求得最后结果。
如:将
x从第p位开始的n位置为“指定”的值。
设
n=3,p=4,原题目即为对x的第4位开始的后3位进行操作。
则常用到的操作元素有
~(~0 << n)<<(p+1-n) == 0000011100
~(~(~0 << n)<<(p+1-n)) ==1111100011
2.在求反中,异或求反非常重要,^运算符运算规律有:
1 ^ 1 = 0 ; 1 ^ 0 = 1
x ^ 1 = ~x ; x ^ 0 = x
3.“& ~”去掉某些属性。如VC++中窗口去掉最大化按钮,
4.我们在移位运算时还常会用到wordlength函数
3.“& ~”去掉某些属性。如VC++中窗口去掉最大化按钮,
WS_OVERLAPPED & ~ WS_MAXIMIZE
4.我们在移位运算时还常会用到wordlength函数
函数:wordlength
功能:计算运行程序的计算机所使用的字长
int
wordlength(
void
)
... {
int i;
unsigned v = (unsigned)~0;
for (i = i; (v = v >> 1) > 0; i++)
;
return i;
}
... {
int i;
unsigned v = (unsigned)~0;
for (i = i; (v = v >> 1) > 0; i++)
;
return i;
}
范例程序
1. 函数:
setbits(x p, n, y)
功能:x从第p位开始的n 位的值被置为y的最右边n位的值,其余各位保持不变。
功能:x从第p位开始的n 位的值被置为y的最右边n位的值,其余各位保持不变。
unsigned setbits(unsigned x,
int
p,
int
n, unsigned y)
... {
return x & ~(~(~0 << n)<<(p+1-n)) |
y<<(p+1-n) & ~(~0 << n)<<(p+1-n);
}
... {
return x & ~(~(~0 << n)<<(p+1-n)) |
y<<(p+1-n) & ~(~0 << n)<<(p+1-n);
}
2. 函数:invert(x,p,n)
功能:x从第p位开始的n位被求反。
unsigned invert(unsigned x,
int
p,
int
n)
... {
return (x |~(~0<<n)<<(p+1-n)) &
~(x & ~(~0 << n)<<(p+1-n));
}
... {
return (x |~(~0<<n)<<(p+1-n)) &
~(x & ~(~0 << n)<<(p+1-n));
}
3 .函数: rightrot(x, n)
功能:将x向右循环移动n位所得到的值。
unsigned rightrot(unsigned x,
int
n)
... {
int wl;
wl = wordlength();
return x>>n | ((x & ~(~0<<n))<<(wl-n));
}
... {
int wl;
wl = wordlength();
return x>>n | ((x & ~(~0<<n))<<(wl-n));
}