C语言按位运算符 按位逻辑运算 移位运算 及其用法

按位逻辑运算符

C语言提供了四种按位逻辑运算符
注:他们的操作数必须是整数。

1.按位取反(~)

~运算符把0变为1,把1变为0,如下例子所示:
~(0100 1001)=10110110,
这里需要注意的是

假设val的类型是unsigned char,已被赋值为2。在二进制中,0000 0010表示2。那么,~val的值是 1111 1101,即253。注意,该运算符不会改变val的值,但是可以这样用:val = ~val。 或者直接声明一个新的变量newval = ~val。

2.按位与(&)

&运算符通过逐位比较产生一个新值,如果把1看为真,0看为假,运算规则可以记为同真则真,一假则假。如下例子所示:
(1001 0011)&(0011 1101)=(0001 0001)

3.按位或(|)

|运算符通过逐位比较产生新值,如果把1看为真,0看为假,运算规则可以记为一真则真。如下例子所示:
(1001 0011)|(0011 1101)=(1011 1111)

4.按位异或(^)

^运算符通过逐位比较产生新值,如果两个运算对象中只有一个为1(但不是两个都为1),结果为1。如下例子所示:
(1001 0011)^(0011 1101)= (1010 1110)
c有一个按位异或和赋值运算结合的运算符:^=.

移位运算符

1.左移

表达式1 << 位数
将表达式1左移运算符右侧指定位数,移出左末端位的值丢,用0填充空出的位置。

2.右移

表达式1 >>位数

将表达式1右移运算符右侧指定位数,移出右末端的值丢掉,对于无符号类型,用0填充空出的位置;对于有符号类型,其结果取决于机器。空出的位置可用0填充,或者填充符号位原本的数字。如下例子所示:
(1000 1010)>>2 //表达式,有符号值
(0010 0010) //在某些系统中的值
(1000 1010)>>2 //表达式,有符号值
(1110 0010) //在另某一些系统中的值
下面是无符号值的例子:
(1000 1010)>>2
(0010 0010)

3.位移运算符用法

移位运算符针对2的幂提供快速的乘法和除法

number<<2 number乘以2的n次幂
number>>2 如果number 为非负,则用number除以2的n次幂

例题(选自c primer plus)
假设用一个unsigned long 类型的值表示颜色值,低阶位字节储存红色的强度,下一个字节储存绿的的强度,第三个字节储存蓝色的强度。随后你希望把每种颜色的强度分别储存在3个不同的unsigned char类型的变量中。那么,可以使用下面的语句:

#define BYTE_MASK 0xff
unsigned long color = 0x002a162f;
unsigned char bule, green, red;
red = color & BYTE_MASK 0xff;
green = (color >> 8) & BYTE_MASK 0xff;
blue = (color >> 16) & BYTE_MASK 0xff;

猜你喜欢

转载自blog.csdn.net/qq_46209845/article/details/110941804