逻辑运算和位运算——与或非、左移和右移

##逻辑运算和位运算——与或非、左移和右移

与:当且仅当两个数的位都为1时,为真。

或:两个数只要任意一个为1时,就为真。

非:真为假,假为真。


这次重点还是放在左移运算和右移运算上。下面代码的注释简化了int型的字节数。int实际上是4个字节。

左移运算:

#include <stdio.h>
int main()
{
	int a = 0b00010100 << 2; // 左移两位
	printf("%d\n", a); // 二进制0b01010000
}

数据左移时候,最左边位将被丢弃,同时在最右边补0。

右移运算:

#include <stdio.h>
int main()
{
	int a = 0b00010100 >> 2; // 右移两位
	printf("%d\n", a); // 二进制0b00000101

	int b = -10 >> 2; // 十进制为-10,二进制为0b11110110
	printf("%d\n", b); // 十进制为-3,二进制为0b11111101
}

右移的时候,最右边的位将被丢弃,但右移要稍微复杂一些。如果数字是一个无符号数值,则用0填补最左边位。如果数字是一个有符号数值,则用根据符号位填补最左边的位。也就是说,对于无符号数,用0填补最左边的位,丢弃最右边的位;对于有符号数,用1填补最左边的位,丢弃最右边的位。