运算

布尔代数中的基本运算

或 |

与 &

取反 ~

异或 ^ (相同为零,不同为一)

计算时&和|的分配律存在

例:(a&b)|c 等同于 (a|c)&(b|c)

位级运算

将其他进制转换成2进制在进行运算

掩码

表达式 ~0 可以生成一个全 1 的掩码,不管机器的字大小是多少。

移位运算

左移 k 位丢掉最高的 k 位,并在右端补 k 个 0。

右移分为逻辑右移算术右移

逻辑右移左端补 0,算术右移左端补最高有效位的值。

一般都对有符号数使用算术右移,即补符号位的值。无符号数,只能是逻辑右移,即补 0

整数

表示:无符号表示与补码表示

(java 只支持有符号数)

数据类型

复数绝对值范围比正数大一(大于等于32位机器在有符号数上)

补码编码

定义:最高位为符号位

[0001]=-0(x)2^3 + 0(x)2^2+ 0(x)2^1+1(x)1

C 库头文件 定义了一组常量来限定不同整数数据类型的取值范围。INT_MAX、INT_MIN、UINT_MAX

C 库头文件 中定义了 uint16_t, int32_t 等类型,用于声明确定宽度类型的整数。

有符号数和无符号数之间的转换

保持位值不变,只改变解释位的方式

补码 x 转无符号数

  • x >= 0,值不变
  • x < 0,转换后的值为 2^w + x

无符号数 x 转补码

  • x < 2^(w-1),值不变
  • x >= 2^(w-1),转换后的值为 x - 2^w

c语言中

C 语言中有符号数和无符号数相加减,有符号被转换成无符号

拓展数字的位表示

扩展无符号数使用零扩展,即在最高位前加 0

扩展有符号数使用符号扩展,即在最高位前加最高有效位的值

截断数字

对一个 w 位的数字截断为一个 k 位数字,将丢弃高 w-k 位。

对于无符号数而言,截断后的数字实际上等于 w mod 2^k,即取余