C语言位运算及其应用
众所周知,数据在计算机内存中都是以二进制的形式存放的。
在计算机发展早期,位运算是C语言特有的运算。深入理解位运算有助于C语言学习进阶。
位运算是按数据在内存中存放的补码进行运算的。
正数的源码,反码,补码都相同。负数的源码(除符号位)按位取反得到反码,反码+1得到补码。
位运算介绍:
1.按位与&:
操作数如果对应的二进制位的值都为1,则该二进制位按位与的结果为1,否则为0;
3&5=1
2.按位或 |
操作数如果对应的二进制位的值都为0,则该二进制位按位或的结果为0,否则为1;
3|5=7;
3.按位异或 ^
操作数如果对应的二进制位的值不同,则该二进制位按位异或的结果为1,否则为0;
3^5=6;
4.按位取反 ~
将操作数的每一位进行取反,即1改为0,0改为1;
~123=-124;
5.多组输入
在做题时,题目中经常会出现多组输入的要求。
可以使用EOF;
因为EOF被定义为-1;而~(-1)=0;因此可以采用另一种方式:
6.交换两个值,不用临时变量
题目:a=3,b=4;不准使用临时变量,交换a,b的值。
此题可以将a,b按位异或解决
int a = 3;
int b = 4;
a = a^b;
b = b^a;
a = a^b;
经过3次按位异或
7.保留数据中的某些位
题目;a=0x12345678;保留a的低字节,高字节舍弃。
分析:a 的低字节是5678,每位与1按位与。
高字节为1234,需要将其变为0,每位与0按位与。
因此a&b,b的高字节位为0,低字节位为1.
b=00000000000000001111111111111111
即b=0x0000FFFF
int main()
{
int a = 0x12345678;
int b = 0x0000FFFF;
a = a&b;
printf("%x", a);
return 0;
}
结果 a=0x00005678;
8.将一个数据的某些位变为1
题目:a=0x12345678;将a的第10位变为1;
分析:将1左移10位,再与a按位或。
int main()
{
unsigned int a = 0x12345678;
a = a | (1 << 10);
printf("%x", a);
return 0;
}
除此之外,位运算还有很多奇技淫巧,时常令人拍案叫绝。