加法器:处理器基础运算单位
| 【与】和【异或】可以组成半加器(加法器的基础) | 
|---|
| > 【异或】表示加法位(相同为0,不同为1) | 
当前运算位, 同时为1时,因为 1+1=10 需要进位,所以当前位归0 同时为0时,因为0+0=0,所以当前位是0 当其中一个是1另一个是0时,因为1+0=1,所以当前位是1
【与】表示进位位(同时为1,才进位)
 |
| 
 |
| 2个半加器加个或门就是全加器 | 
|---|
| > 功能和半加器一样 | 
【或】表示输出进位位(同时为0,才不进位,否则进位)
 |
| > 
|
| 全加器可以串联起来,进行多位运算 | 
|---|
| > (进位位S是头尾相连的,超出运算范围会导致溢出问题) | 
32位电脑一次能计算32位内的加法 64位电脑一次能计算64位内的加法
| | > A+B=S
|
位运算
位运算时二进制的一种运算 位运算时计算机底层的基础运算,是效率最高的运算 位运算时优先级最高的运算
| 运算符 | 运算规则 | 用途 | |
|---|---|---|---|
| & | 与 and  | 
同时为1时,结果为1 只要有个不为1,结果为0  | 
将位改0,查询位、奇数偶数判断 | 
| | | 或 or  | 
同时为0时,结果为0 只要有个不为0,结果为1  | 
将值改1,查询位 | 
| ^ | 异或 xor  | 
相同为0,不同为1 | 只能用于对比值是否一样 (不能查询位的值具体是多少)  | 
| ~ | 取反 | 1变0,0变1 | |
| << | 左移 | 全部往左移,高位丢,低位补0 | 如果高位是0,每移一位,相当于乘以2 | 
| >> | 右移 | 全部往右移,低位丢(或补位),无符号高位补0,有符号以编译器为准 | 每移一位,相当于除以2 | 
位运算的应用
保存布尔值:或、与
一个变量保存一个布尔值显然过于不划算,布尔值只有1和0 一个变量的每个位都能保存1和0,最小的char类型,都有8位 位来保存布尔值最划算的方式
而位运算可以用来写入布尔值
| 写入1:或运算 | 
|---|
| > 写入值为0时保存不变 | 
写入值为1时输出强制输出1
| | > 变量值、写入值、修改结果
1000 | 0100 = 1100 //该位布尔值为1 1100 | 0010 = 1110 //该位布尔值不为1
|
| 擦除0:与运算 | 
|---|
| > 擦除值为1时保存不变 | 
擦除值为0时输出强制输出0
| | > 变量值、擦除值、修改结果
1000 & 0111 = 0000 //该位布尔值为1 1111 & 0010 = 1101 //该位布尔值不为1
|
unsigned char value=0b10101010; //初始化一个变量value = value|0b00001111; //写入前4位(将前4位设为1)value = value&0b00001111; //擦除后4位(将后4位清0)printf("%d",value); //输出结果15 即二进制的 0000 1111
查询布尔值:与、(或)
位运算可以用来查询布尔值
| > 利用与判断位值:
变量值:用来保存布尔值的变量 对照值:将要对照的变量值(对应位)设置为1,其他设置为0 查询结果:与运算结果
| | —- | | > 变量值、对照值、查询结果
1101 & 0100 = 0100 //该位布尔值为1 1101 & 0010 = 0000 //该位布尔值不为1
| | > 当 查询值 和 查询结果 一致时,则查询值(对应位)为1
当 查询结果 为0时,则查询值(对应位)为0
|
char value = 0b1101;if(value & 0b0100 == 0b0100){printf("第三位值是1");}else{print("第三位值不是1");}
| > 【(|)或运算】,也能实现寻找某个特定位的布尔值
与运算是找在1 或运算是找在0 全部设置为1,要找0的 那一位设置为0
| | —- | | > 变量值、对照值、查询结果
1101 & 1101 = 1101 //该位布尔值为0 1101 & 1011 = 1111 //该位布尔值不为0
|
char value = 0b1000;if(value | 0b1101 == 0b1101){printf("第二位值是0");}else{print("第二位值不是0");}
对比布尔值:异或
用于对比位的值是否一样(类似于==,只是一个用来对比数值,一个用来对比位值)
| > 当结果为1时,说明同时为0或者同时为1
当结果为0时,说明两者不一致
| | —- | | > 0001^1100 = 0010
|
char value = 0b0001;value = value ^ 0b1100;print("%d", value);
判断奇偶:与
奇数的最低位是1 偶数的最低位是0 用【与运算】判断【最低位】是0还是1即可
char value = 0b1111;if(value & 0b01 == 0b01){printf("是奇数");}else{print("是偶数");}
乘除2:左移、右移
往左移一次,就是乘以2 2 << 1 = 4 往右移一次,就是除以2 2 >> 1 = 1
unsigned char value = 2;value = value << 1; //往左移动1位printf("%d", value); //输出4value = value >> 1; //往右移动1位printf("%d", value); //输出2


