位运算是指以二进制为基础进行的运算。 在系统软件中,经常需要处理二进制位问题。 C语言提供了6位操作符。 这些运算符只能与整数操作数一起使用,即它们只能与有符号或无符号 char、short、int 和 long 类型一起使用。
C语言提供的位运算符列表:
1.“按位与”运算符(&)
按位与是指参与运算的两个数据按照二进制位进行与运算。 如果两个相应的二进制位都为 1,
该位的结果值为 1; 否则为0。这里的1可以理解为逻辑上的真,0可以理解为逻辑上的假。一点一点地用它
“与”的实际和逻辑运算规则是一致的。 逻辑“AND”要求所有操作数都为真,结果才为真。 如果 A=true,B=true,则 A∩B=true
例如:
3&5 3 的二进制代码是 11(2)。 (为了区分十进制和其他基数,本文规定所有非十进制数据必须在数据后附加括号,括号表示基数,二进制标记为2)内存存储数据的基本单位是字节(Byte),一个字节由8位组成。 位是用于描述计算机数据量的最小单位。 在二进制系统中,每个0或1都是一个位。 将 11(2) 补成一个字节是 (2)。 5的二进制码是101(2),如果补成一个字节就是(2)。
按位与运算:
(2)
&(2)
(2)
由此可知3&5=1
c语言代码:
按位与的用途:
(1) 清除
如果要清除一个内存单元,即使它的二进制位全部为0,只需要找到一个二进制数,其中每个位都满足以下条件:
原数中为1的位,新数中对应的位为0,然后将两者进行&运算,达到清零的目的。
例子:
原数是43,即(2)。 找另一个数,设其为148,即(2),将两者进行按位与运算:
(2)&(2)
(2)
C语言源代码:
(2) 取一个数中的某些指定位
如果有一个整数a(2byte),想要得到低字节,只需要将a与8个1按位与即可。
01100
乙01111
c 01100
(3)预留指定位置:
对数字执行“按位与”运算,该位的计算结果为 1。
例如:有一个数字84,即(2),你想保留左起第3、4、5、7、8位数字。 操作如下:
(2)
&(2)
(2)
即:a=84,b=59
c=a&b=16
C语言源代码:
2.“按位或”运算符(|)
只要对应的两个二进制位中有一个为 1,则该位的结果值为 1。借用逻辑中 OR 运算的话说,一个真理就是真。
例如:60(8)|17(8),将八进制60和八进制17进行按位或运算。
|
C语言源代码:
应用:按位或运算常用于将某个数据的某些位设置为1。例如:要将数字a的低4位改为1,只需要将a和a进行按位或运算即可17(8)。
3.“异或”运算符(^)
他的规则是:如果参与运算的两个二进制位的值相同,则为0,否则为1
即,0∧0=0、0∧1=1、1∧0=1、1∧1=0。
*例子:*
∧
C语言源代码:
应用:
(1) 翻转特定位
假设数字(2),想要翻转它的低4位,即1变成0,0变成1。可以与(2)进行“异或”运算,即:
^
运算结果的低4位正好是原数的低4位的反转。 可见,如果想要翻转哪些位,只需将进行∧运算的位设置为1即可。
(2)与0异或,保留原值
例如:012^00=012
^
因为原数中1与0异或运算结果为1,0^0运算结果为0,所以保留原数。
(3) 不使用临时变量交换两个值
例如:a=3,即11(2); b=4,即 100(2)。
如果想互换a和b的值,可以使用下面的赋值语句:
a=a∧b;
b=b∧a;
a=a∧b;
a=011(2)
(∧)b=100(2)
a=111(2)(a∧b的结果,a变成了7)
(∧)b=100(2)
b=011(2)(b∧a的结果,b变成了3)
(∧)a=111(2)
a=100(2)(a∧b的结果,a变成了4)
相当于下面两步:
① 执行前两条赋值语句:“a=a∧スb;” 和“b=bbb∧a;” 等价于 b=b∧(a∧b)。
② 执行第三条赋值语句:a=a∧b。 由于a的值等于(スa∧b)并且b的值等于(スb∧a∧b),
因此,等价于a=スa∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,也等于b。 太奇妙了!
C语言源代码:
4.“否定”运算符(~)
它是一个一元运算符,用于求整数的二进制补码,即在操作数的每个二进制位上将 1 变为 0,将 0 变为 1。
例如:~77(8)
源代码:
5. 左移运算符()
右移运算符用于将数字的每个二进制位向右移动若干位。 移动的位数由右操作数指定(右操作数必须是非负值)。 移到右端的低位被丢弃。 对于无符号数,高位用0填充。对于有符号数,有些机器会用符号位填充左边空出的部分(即“算术移位”),而另一些机器会用0填充左边空出的部分(即“逻辑移位”)。转移”) 。
注意:
对于无符号数,右移时左高位移为0; 对于有符号值,如果原来的符号位为0(即数为正数),则左侧高位也移为0。如果符号位原来为1(即负数),则左侧移入为 0 或 1,具体取决于所使用的计算机系统。 有的系统将其移至0,有的系统将其移至1。移入0称为“逻辑移位”,即简单移位; 移至 1 称为“算术移位”。
示例:a 的值为八进制数:
a:01101(以二进制形式表示)
a>>1: 10110(逻辑右移时)
a>>1: 10110(算术右移时)
在某些系统上,a>>1 会产生八进制数,而在其他系统上则可能是 。 Turbo C 和其他一些 C 编译器使用算术右移,即当一个有符号数右移时,如果符号位原来为 1,则左移的高位为 1。
源代码:
7. 按位赋值运算符
位运算符和赋值运算符可以构成复合赋值运算符。
例如:&=、|=、>>=、