1, 存储器由若干“字节”byte单元组成。而每个字节都有一个地址,当然这个地址是物理排序的,怎么说呢?好比就是从0开始刻出的标尺一样的刻度位置,所以地址是物理固定的;我们说的改变地址,其实改变的不是地址,而是地址里面的内容。字节则是由若干个二进制位bit组成的。而若干个字节组成一个存储单元(比如4个字节可以存储Int整数的单元),叫做“字”(word)。在每一个存储一个数据或者一个指令(所谓的32位,64位指令系统)。另外,一个字节由8个二进制位组成,最右边的一位是“最低位”,最左边的一位是“最高位”,每个位上的值是0或者1。比如ox10000001表现了这个高位序列。
2, 表示数值的方法:原码,反码和补码。
1) 原码。最高位是符号位(0表示正,1表示负),其他各位表示数值本身的绝对值。注意小谭说,+0和-0表示的不是同一个0,在内存中有两个表示,所以0不适合计算机的运算。有个问题,在我们编程中经常用到比较(如:value == 0 )这样的表达式,经过实践的检验是正确可行的,我测试了一下,正0和负0都表示成了同一个值。怎么证明小谭的说法,请大家指点。
2) 反码。若一个值是正,其反码和原码是一样的;若为负,则符号位为1,其余各位是对原码取反。
3) 补码。原码和反码不适合计算机内运算,因为要单独处理其符号。补码规则:对整数,原码、反码、补码相同;对负数,最高位为1,其余各位取原码的反,然后对整个数加1。
4) 总结:这些数值表示,在我编程过程中从来没有考虑和体验过,一定是我太菜的缘故。
3, 位运算。运算量只能是整数或者字符型,不能为实数等其他类型。
1) & 按位与:两个相应位都位1,则为1,否则为0。特殊用途
l 清零。找一个数满足原来的数中为1的位在新数中对应0条件即可。
l 取一个数的指定位。比如高位或者低位,将所取的位对应1,其他位对应0。
2) |按位或:两个相应位只要有一个为1,该位结果为1。作用主要是对一个数据某些位定位为1。
3) ^ 按位异或:参加运算的两个相应位同号,则为0;异号则为1。注意
l 特定位翻转。构造的数在特定位上取1,其余位取0
l 与0相^,则是保留原值。
l 交换两个值,不用临时变量。a = a ^b; b=b^a;a=a^b
4) ~ 取反:对二进制按位取反,注意其优先级特别高
5) << 左移:左移一位相当于该数乘以2,两位乘以4,改规则只适合在左翼中溢出的被舍弃的高位不含1的情况。
6) >> 右移:就好理解了,但是要注意符号位问题。
l 无符号数,右移在左边高位移入0。
l 有符号数,整数的话移入0,负数的话,移入0或1取决于所用的计算机系统。即移入0为“逻辑右移”,移入1为“算术右移”。