persuper的专栏

网聚个人的力量,成就别人的霸业!

数值表示与位运算一点笔记

 

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,负数的话,移入01取决于所用的计算机系统。即移入0为“逻辑右移”,移入1为“算术右移”。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭