Math 方程式x&;(x-1)有效吗?
来自黑客的喜悦:第二版:Math 方程式x&;(x-1)有效吗?,math,assembly,binary,bit-manipulation,arithmetic-expressions,Math,Assembly,Binary,Bit Manipulation,Arithmetic Expressions,来自黑客的喜悦:第二版: 这里的公式似乎有点尴尬。当x小于1时,如何从1向量中减去一些x向量(假定为0x1111 1111)?(比如:(如示例所示)0x0101 1000-0x0000 0000对我来说没有任何意义)前者比第一个小,单词也不存储有符号向量。这是与RISC相关的吗 如本书注释部分所述。粗体字母对应于x=00000000等单词的向量。粗体与浅色不同。粗体1=11111111,这是一个8位字 Edit2:特别感谢保罗·汉金(Paul Hankin)找出这里使用的非传统符号。粗体
这里的公式似乎有点尴尬。当x小于1时,如何从1向量中减去一些x向量(假定为0x1111 1111)?(比如:(如示例所示)0x0101 1000-0x0000 0000对我来说没有任何意义)前者比第一个小,单词也不存储有符号向量。这是与RISC相关的吗
如本书注释部分所述。粗体字母对应于x=00000000等单词的向量。粗体与浅色不同。粗体1=11111111,这是一个8位字
Edit2:特别感谢保罗·汉金(Paul Hankin)找出这里使用的非传统符号。粗体字表示32位大小的字[00000001],浅体字表示数字1,如C所示。让我们看看
x-1的作用。
假设x
是一个值????1000
(?是0还是1)
=>x-1=????0111
=>x&(x-1)=????0000
无论最右边的1位于x
中的什么位置,它都非常相似
请求的示例:
x=00001111
=>x-1=00001110
=>x&(x-1)=00001110
p.s.x-1=000011100-00000001(00001110+11111111)
减去1
因为我们更熟悉十进制而不是二进制,所以有时看看十进制中发生了什么会有所帮助
在十进制中减去1会发生什么?例如1786000-1=1785999
如果从十进制正数x
中减去1
:
x
右侧的所有零变为9
李>
x
最右边的非零位变小1李>
- 其他数字不受影响
现在,在二进制中,它的工作原理完全相同,只是我们只有01
而不是012456789
如果从二进制数字x
中减去1
:
x
右侧的所有零变为1
李>
x
最右边的非零位变为0
李>
- 其他位不受影响
负数呢?令人高兴的是,使用2的补码表示负数的行为与正数完全相同。事实上,当查看x
的位时,您可以从x
中减去1
,而无需知道x
是有符号整数还是无符号整数
x&(x-1)
让我们从一个例子开始:x=01011000
。我们可以用我刚才解释的方法减去1:
x = 01011000
x-1 = 01010111
现在,按位and操作x&(x-1)
的结果是什么?我们在每列中取两位;如果它们都是1,我们写1;如果其中至少有一个为0,则我们写入0
x = 01011000
x-1 = 01010111
x&(x-1) = 01010000
发生了什么事
x
右侧的所有零保持为零李>
x
中最右边的1由于x-1
而变为0李>
- 所有其他位不受影响,因为它们在
x
和x-1
中相同
结论:我们已将x
中最右边的1归零,其他所有位均不受影响。当从数字中减去1时,所有最右边的零将一直进行,直到找到1为止。然后,因为你要减去1,所以它变成了0,而之前的0变成了1。从右边看这个新数字,你会看到它有所有的1,其中x
有零,然后它有一个零(而x
有1),在这之后,两个数字相等。对它们进行ANDing运算后,将只清除x
中最右边的1个。简单地说,减去1不会得到由1后跟0或更多0构成的最右边序列。在纸上这样做将极大地帮助你形象化它。试几个例子。你在问题中提到了向量,但那是个错误——没有向量,只有无符号整数。0和1是数字的二进制表示形式,仅用于解释。x
是一个数字1
也是一个数字。看不到矢量。如果x
是5
,则x-1
是4
。浅面1是一个数字。粗体1是0和1的固定长度向量,表示1的二进制形式(例如:00000001)。粗体加法是书中定义的“向量加法”,它对应于计算机算术,而不是世界上其他所有人所说的向量加法。如果你想到C,粗体数字代表机器字,浅体数字代表正则数。这就是被书中的定义所掩盖的意图。你可以展示你对x做的和x=00001111一样的事情吗?这里的(x-1)相当于(00001111-11111111)。你要怎么做?事实上是相反的@保罗·汉金解码了它。向量1将[0000000 1]和光面1称为[11111111],感谢所需示例的演示:)另请参见此清晰最低集和其他比特破解的更多工作示例。