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],感谢所需示例的演示:)另请参见此清晰最低集和其他比特破解的更多工作示例。