数字(二)
C中的移位运算
首先移位有两种,第一种是左移位,第二种是右移位。移位运算主要体现在二进制情况下。
左移位(<<)
假设一个数x,x<<k生成一个值,这个值是x丢弃最高k位,最低k位补0后得到的
右移位(>>)
右移位分为逻辑右移和算术右移,逻辑右移是在左端补k个0,而算术右移则是在左端补k个最高有效位的值。一般有符号数都执行算术右移,无符号数进行逻辑右移,而在Java中>>是算术右移,>>>是逻辑右移。
k过大怎么办?
在计算机中,移位指令只考虑位移量的低log2ω位,也就是说实际位移量为k mod ω。
数的表示
无符号数的编码
假设一个无符号的二进制表示为[xω-1, xω-2, …, x0],那么该无符号数十进制表示为
补码编码
补码主要用来表示有符号数,它将字的最高有效位解释为负权,即有符号数十进制表示为
反码
除了最高有效位的权是-(2ω-1-1),另外和补码是一样的,即
[00…0]解释为+0,-0则表示为[11…1]
原码
最高有效位是符号位,用来确定剩下的位应该取负权还是正权。即
[00…0]解释为+0,-0表示为[10…0]