"Detects zero bytes inside a 32 bit integer"的这段代码有什么用?
What is the use of this code that "Detects zero bytes inside a 32 bit integer"?
原帖http://bits.stephan-brumme.com/null.html
-
这段代码是做什么的?(回复,谢谢)
-
在哪里使用?
bool hasZeroByteSimple(unsigned int x) { if ((x & 0x000000FF) == 0) return true; if ((x & 0x0000FF00) == 0) return true; if ((x & 0x00FF0000) == 0) return true; if ((x & 0xFF000000) == 0) return true; return false; }
检查unsigned int
中是否有0x00字节,以下是一些示例:
0x11223300
0x11220033
0x11002233
0x00112233
作为一个反例,尽管这个数字有零,但它没有零byte
:
0x70801206 (bytes: 0x70, 0x80, 0x12, 0x06)
作为第二个反例,尽管这个数字在一行中有8个0位,但如果你将这个数字分解成它的四个组成字节,它就没有零byte
:
0x10023456 (bytes: 0x10, 0x02, 0x34, 0x56)
EDIT:在回答您的其他问题时,当您试图在字符串中找到NULL终止符时,您将查找零字节,就像您正在计算strlen()
函数的等量一样。您可以一次查看4个字节(unsigned int),而不是逐个字节查看。
假设unsigned int
为32位(4字节)宽,并检查x
中是否至少有一个字节为零。
作者认为这可以用来加快strlen()
,通过快速检测在四个连续字符的块中是否存在NUL终止符。如果没有,strlen()
可以移动到下一个区块;如果有,则需要重新检查这四个字节,以确定其中哪个是NUL。
这段代码只是检查数字是否有一个零字节,这意味着它是一个由8位组成的字节,全部设置为零。
0xFF是255,所以如果x &255是零,这意味着最后一个字节都是零。0xFF00是255^2,所以在这种情况下,第二个字节都是零,以此类推,直到第四个字节。
正如其名称所示,该函数检查形参(4byte unsigned int)是否至少包含一个字节,该字节完全为零。
x
由四个字节组成。它检查这两个字节是否有一个为零。
相当于:
return memchr(&x, 0, sizeof x);
也就是说,它在x
占用的内存中搜索一个零字节,并根据是否找到这样一个字节返回true或false。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 0-1背包代码中的错误.我的代码中有什么错误
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 这行代码在C++类中意味着什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 此代码中的操作流程是什么?C/C++.
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 此代码验证公式是什么意思?
- 需要以下代码的帮助,下面的代码有什么问题
- C++标准提案代码:什么是 N 和 P?
- C - 哈希算法代码什么都没有返回
- 将"12345678"转换为"1-234-5678",我的代码什么也没产生
- 在编译过程中,琐碎的(没有效果的)代码什么时候会被删除
- 有人能告诉我为什么这个代码什么都不打印吗