##逻辑运算和位运算——与或非、左移和右移
与:当且仅当两个数的位都为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填补最左边的位,丢弃最右边的位。