- himagic = 0x80808080L;
- lomagic = 0x01010101L;
- if (((longword - lomagic) & ~longword & himagic) != 0)
很多人对if (((longword - lomagic) & ~longword & himagic) != 0)不好理解。
看glibc的changelog发现之前是样的if (((longword - lomagic) & himagic) != 0),这样写会无法处理字节中大于127的情况,需要在后面的代码中继续处理。
那为什么加上& ~longword呢?
我的理解是这样可以检查longword是否有一个字节的第8位是从0到1还是从1到0。
如果~longword后某个字节第8位是1,且进行(longword - lomagic) & ~longword运算后这个字节的第8位还是1,那么很明显(longword - lomagic)的运算是借了位的;
如果~longword后某个字节第8位是0,那么也很明显这个字节的减一运算一定不会借位。
阅读(1332) | 评论(0) | 转发(0) |