C语言 位操作

定义

位操作提高程序运行效率,减少除法和取模的运算。在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。

左移

后空缺自动补0

右移

分为逻辑右移和算数右移

逻辑右移

不管什么类型,空缺自动补0

算数右移

若是无符号数,则空缺补0,若是负数,则空缺补1

移位运算符

位运算符操作的都是整型的数据

<<:在一定范围内,每向左移1位,就相当于*2

>>:在一定范围内,每向右移1位,就相当于/2

左移运算符

左移运算符是一个计算机用语。用来将一个数的各二进制位全部左移若干位,移动的位数由右操作数指定,右操作数必须是非负值,其右边空出的位用0填补,高位左移溢出则舍弃该高位。

计算方法

左移表达式的位 result = expression1 << expression2

参数 result,任何变量。

expression1,任何表达式。

expression2,任何表达式。

说明:<<运算符把expression1的所有位向左移expression2指定的位数。

左移

运算规则

按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

语法格式

需要移位的数字 << 移位的次数

数学意义

在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。

带符号右移 >>

运算规则

按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。

语法格式

需要移位的数字 >> 移位的次数

数学意义

右移一位相当于除2,右移n位相当于除以2的n次方。这里是取商哈,余 数就不要了。

无符号右移 >>>

运算规则

按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。 其他结构和>>相似。

C语言 位操作_第1张图片

按位逻辑运算符

二进制反码或按位取反:~

一元运算符~把1变为0,把0变为1

~a不会改变a的值,但是该运算符确实创建了一个可以使用或者赋值的新值

char a=2;

char b=~a; //a的值不会被改变

a=~a; //改变了a的值

printf("%d",~a);

a的值为00000010,~a的值为11111101

按位与:& 都为1,结果为1

二元运算符&通过逐位比较两个运算对象,生成一个新值。对于每一位,只有两个运算对象中相应的位都为1时,结果才是1

&=

val &=0377;+

val=val & 0377; //二者等价

按位或:| 至少一个为1,结果为1

二元运算符|,通过逐个比较两个运算对象,生成一个新值。对于每个位,如果两个运算对象中相应的位为1,结果就为真

|=

val |= 0377;

val=val | 0377; //二者等价

按位异或:^ 只有一个为1,结果为1

二元运算符^逐位比较两个运算对象。对于每一位,如果两个运算对象中相应的位一个为1,但不是两个都为1,结果为1

^=

val ^=0377;

val=val^0377; //二者等价

应用

掩码:按位与 &

打开位(设置位) :|

关闭位(清空位):&和~

切换位 :^

检查位的值

你可能感兴趣的:(C语言,c语言)