加法器:处理器基础运算单位

【与】和【异或】可以组成半加器(加法器的基础)
> 【异或】表示加法位(相同为0,不同为1)

当前运算位, 同时为1时,因为 1+1=10 需要进位,所以当前位归0 同时为0时,因为0+0=0,所以当前位是0 当其中一个是1另一个是0时,因为1+0=1,所以当前位是1

【与】表示进位位(同时为1,才进位)

| | image.png |

2个半加器加个或门就是全加器
> 功能和半加器一样

【或】表示输出进位位(同时为0,才不进位,否则进位) image.png

| | > image.png

|

全加器可以串联起来,进行多位运算
> (进位位S是头尾相连的,超出运算范围会导致溢出问题)

32位电脑一次能计算32位内的加法 64位电脑一次能计算64位内的加法 image.png

| | > A+B=S

|

image.png

位运算

位运算时二进制的一种运算 位运算时计算机底层的基础运算,是效率最高的运算 位运算时优先级最高的运算

运算符 运算规则 用途
&
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

|

  1. unsigned char value=0b10101010; //初始化一个变量
  2. value = value|0b00001111; //写入前4位(将前4位设为1)
  3. value = value&0b00001111; //擦除后4位(将后4位清0)
  4. printf("%d",value); //输出结果15 即二进制的 0000 1111

查询布尔值:与、(或)

位运算可以用来查询布尔值

| > 利用与判断位值:

变量值:用来保存布尔值的变量 对照值:将要对照的变量值(对应位)设置为1,其他设置为0 查询结果:与运算结果

| | —- | | > 变量值对照值查询结果

1101 & 0100 = 0100 //该位布尔值为1 1101 & 0010 = 0000 //该位布尔值不为1

| | > 当 查询值 查询结果 一致时,则查询值(对应位)为1

查询结果 为0时,则查询值(对应位)为0

|

  1. char value = 0b1101;
  2. if(value & 0b0100 == 0b0100)
  3. {
  4. printf("第三位值是1");
  5. }
  6. else
  7. {
  8. print("第三位值不是1");
  9. }

| > 【(|)或运算】,也能实现寻找某个特定位的布尔值

与运算是找在1 或运算是找在0 全部设置为1,要找0的 那一位设置为0

| | —- | | > 变量值对照值查询结果

1101 & 1101 = 1101 //该位布尔值为0 1101 & 1011 = 1111 //该位布尔值不为0

|

  1. char value = 0b1000;
  2. if(value | 0b1101 == 0b1101)
  3. {
  4. printf("第二位值是0");
  5. }
  6. else
  7. {
  8. print("第二位值不是0");
  9. }

对比布尔值:异或

用于对比位的值是否一样(类似于==,只是一个用来对比数值,一个用来对比位值)

| > 当结果为1时,说明同时为0或者同时为1

当结果为0时,说明两者不一致

| | —- | | > 0001^1100 = 0010

|

  1. char value = 0b0001;
  2. value = value ^ 0b1100;
  3. print("%d", value);

判断奇偶:与

奇数的最低位是1 偶数的最低位是0 用【与运算】判断【最低位】是0还是1即可

  1. char value = 0b1111;
  2. if(value & 0b01 == 0b01)
  3. {
  4. printf("是奇数");
  5. }
  6. else
  7. {
  8. print("是偶数");
  9. }

乘除2:左移、右移

往左移一次,就是乘以2 2 << 1 = 4 往右移一次,就是除以2 2 >> 1 = 1

  1. unsigned char value = 2;
  2. value = value << 1; //往左移动1位
  3. printf("%d", value); //输出4
  4. value = value >> 1; //往右移动1位
  5. printf("%d", value); //输出2