《深入浅出node.js》中 if (pool.used & 7) pool.used = (pool.used + 8) & ~7 这句话怎么理解?
发布于 8 年前 作者 xsTao 4051 次浏览 来自 问答

在看《深入浅出node.js》的buffer这章时,看到以下这段代码: new Buffer(1024); this.parent = pool; this.offset = pool.used; pool.used += this.length; if (pool.used & 7) pool.used = (pool.used + 8) & ~7;

其大意是:当前Buffer对象的parent属性指向该slab,并记录下是从这个slab的哪个位置( offset)开始使用的, slab对象自身也记录被使用了多少字节, 但我一直没理解 ** if (pool.used & 7) pool.used = (pool.used + 8) & ~7** 这句话的意思和作用,上网搜了一发也没找到答案,有知道的大神恳请指导指导,非常感谢!

12 回复

&是按位与,~是按位取反。~的优先级比&高。

@anotherWill 嗯嗯 其实我想知道的是: 为什么要跟7 按位与,加上8 再与7的反进行与操作,得到的是什么??

pool.used 地址按8字节对齐。

@xsTao if (pool.used & 7)这个括号内pool.used的值只要8的倍数或者0都为0(正负8/16/32…),就是false了。应该是(pool.used + 8)先执行,然后这个值再和取反的7做按位与运算。又因为pool.used不能为8的时候才能进 if 条件。pool.used不为0并且不是8的倍数。好。假设pool.used是0或者8的倍数,设(pool.used)为x,x&~7结果就是0。

@yjhjstz 大神。为什么要地址对齐呢?

非常感谢楼上几位的回答,@yjhjstz @anotherWill 解决了我的困惑,再次感谢!

@xsTao LZ,为什么要让地址对齐呢?

我猜测是跟utf8编码有关 因为utf8编码的关系所以一个字符占的空间是8字节的倍数 From Noder

@anotherWill 这个我也不知道,楼下说的utf8编码?看你@大神了

https://github.com/yjhjstz/deep-into-node @xsTao buffer 章节做了解答,@IssicLzx 并不是utf8编码的关系。

@yjhjstz 谢谢花时间来解答,讲的很细致,学习了,支持一下!

@yjhjstz 谢谢指导,学习了,已点星

回到顶部