加法器:处理器基础运算单位
【与】和【异或】可以组成半加器(加法器的基础) |
---|
> 【异或】表示加法位(相同为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); //输出4
value = value >> 1; //往右移动1位
printf("%d", value); //输出2