C3计算机中的运算
按位运算
按位与and &
提取二进制数中的指定位,或者特定位赋1赋0
利用掩码(masking)操作,通过与给定的位模式(掩码)进行按位与,可以提取所需要的位。如0x0F & 0x8C = 0x0C,通过掩码0x0F提取了0x8C的低四位
按位或or |
在特定位上进行(或1)无条件赋值1
按位取反not ~
把二进制中的1变成0,0变成1
按位异或xor ^
不同则为1,相同则为0
判断两个二进制数是否相等;对二进制数进行按位取反(异或1都取反,异或0不变)
逻辑运算
与 &&、或 || 、非 !
返回值为布尔值: 真(True,1) 或 假(False,0)
移位操作
算术左移和逻辑左移 <<
高位移出,低位补0;效果上实现乘2
x<<k 表示对数x左移k位,相当于数值x乘以2k,结果可能溢出
算术右移 >>
高位补符号位,低位移出;效果上实现除2
x>>k 表示对数x右移k位,,相当于数值x除以2k
C语言中并没有规定右移是哪种,默认算术右移。
逻辑右移
补零
操作
无符号数
左右移指逻辑左(右)移,当高位移出的是1,则左移时发生溢出
有符号数
算术左移:高位移出,低位补0;若移出的为不等于新的符号位,则溢出。
算术右移:高位补符号位,低位移出;可能发生数据丢失
位扩展和位截断运算
0扩展
在无符号数中,高位补足够多的0
符号扩展
在用补码表示的带符号整数中,前面补足够多的符号位
位截断运算
当长数被强制转换成短数时,就会发生截断(仅保留低数位)。P69
0000 8000H 截断为16位时:8000H
加减法
二进制加法:加法位表+进位位表
补码:将减法变成了加法
符号部分同源码,0表示正数,1表示负数
数字部分
正数,补码数值部分与原码数值部分相同
负数,补码数值部分是将原码数值部分按位取反再加1.
补码运算溢出了怎么办??
采用变形补码-两位符号位
两个符号位表示结果正常
01正溢出
10负溢出
进位标志位CF
溢出标志位OF
加法器设计
半加器
全加器
串行进位加法器
并行进位加法器:提高加法器速度
提前算出进位
位数较多的加法器,应分组,组内(4/8位一组)并行,组间串行或并行