信息的表示和处理
2020-10-07 本文已影响0人
老杜振熙
在阅读《深入理解计算机系统》的过程之中,有一些知识点是我觉得有必要记录下来的,在这里进行一定的总结。
-
文本数据比二进制数据具有更好的平台独立性
文本数据VS二进制数据.png
一个简单的数字,比如说int num = 18;
在内存中存储的形式会因为大端法和小端法两种形式而有所不同。因此,如果采用二进制格式存储(直接将内存中的存储格式复制到磁盘上),那么就会因为不同的机器而产生不同。相反,文本数据会将数据进行编码后再存储,因此独立性更好。 -
理解异或
^如何和|联系起来呢?其实很简单,先将两个操作数中同为1的比特位都置为0,然后再对其进行|操作即可;利用这个思路,我们可以使用bis(位设置)和bic(位清除)两个函数来实现异或操作。 -
补码的二进制
对于补码的二进制而言,最需要注意的就是:最高位为负权。这也就解释了为什么10000000代表了8位signed integer的最小值-128,而11111111代表的是-1。 -
算数右移和逻辑右移
算数右移唯一的区别是:当对有符号类型的负数进行位右移时,高位补1;这样会带来一些更直观的结果,比如说对于8位signed integer而言,当其为-128,对应二进制为10000000时,如果是算数右移,将得到二级制形式11000000,翻译为十进制则是-64,恰好符合直观感受。但如果是逻辑右移,就会使负数变为正数。 -
无符号数
无符号数有一些奇怪的特性。比如unsigned a = 1, b = 2;
那么当a-b
时结果不会是负数,相反,结果会变成一个很大的正数。原因则是无符号数不判断溢出,它直接进行取模,也就是说:a-b == (int)a-(int)b+pow(2, w)
,w为变量的位数。-(int)b+pow(2, w)
也称为b的逆元。 -
小技巧
-x == ~x+1
x & (-x) // 只保留x最右侧的1,其他全部清为0;
x & (x-1) // 清除x最右侧的1