信息的表示和处理

2020-10-07  本文已影响0人  老杜振熙

在阅读《深入理解计算机系统》的过程之中,有一些知识点是我觉得有必要记录下来的,在这里进行一定的总结。


  1. 文本数据比二进制数据具有更好的平台独立性

    文本数据VS二进制数据.png
    一个简单的数字,比如说int num = 18;在内存中存储的形式会因为大端法小端法两种形式而有所不同。因此,如果采用二进制格式存储(直接将内存中的存储格式复制到磁盘上),那么就会因为不同的机器而产生不同。相反,文本数据会将数据进行编码后再存储,因此独立性更好。
  2. 理解异或
    ^如何和|联系起来呢?其实很简单,先将两个操作数中同为1的比特位都置为0,然后再对其进行|操作即可;利用这个思路,我们可以使用bis(位设置)和bic(位清除)两个函数来实现异或操作。

  3. 补码的二进制
    对于补码的二进制而言,最需要注意的就是:最高位为负权。这也就解释了为什么10000000代表了8位signed integer的最小值-128,而11111111代表的是-1。

  4. 算数右移和逻辑右移
    算数右移唯一的区别是:当对有符号类型的负数进行位右移时,高位补1;这样会带来一些更直观的结果,比如说对于8位signed integer而言,当其为-128,对应二进制为10000000时,如果是算数右移,将得到二级制形式11000000,翻译为十进制则是-64,恰好符合直观感受。但如果是逻辑右移,就会使负数变为正数。

  5. 无符号数
    无符号数有一些奇怪的特性。比如unsigned a = 1, b = 2;那么当a-b时结果不会是负数,相反,结果会变成一个很大的正数。原因则是无符号数不判断溢出,它直接进行取模,也就是说:a-b == (int)a-(int)b+pow(2, w),w为变量的位数。-(int)b+pow(2, w)也称为b的逆元。

  6. 小技巧
    -x == ~x+1
    x & (-x) // 只保留x最右侧的1,其他全部清为0;
    x & (x-1) // 清除x最右侧的1

上一篇下一篇

猜你喜欢

热点阅读