【问题标题】:Is there an efficient way to construct b10101010101010101010101010101010? [closed]有没有一种有效的方法来构建 b10101010101010101010101010101010? [关闭]
【发布时间】:2013-06-10 04:39:19
【问题描述】:

我想构造二进制字符串 10101010101010101010101010101010(即 16 个 1 和 16 个 0)表示的无符号整数(4 个字节)。

有没有一种有效的方法来使用位操作来构造这个值?我可以在 for 循环中做到这一点,但我觉得这样做效率很低。

任何语言都适合我。我个人了解 c 和 C++。

【问题讨论】:

  • 呃,不是0xAAAAAAAA吗?只需创建一个长度为 4 的字符串,其字符为 0xAA...
  • @DavidFaux 1010 在二进制中是十进制 10(很容易记住,原因完全相同)。十进制的 10 是十六进制的A
  • @DavidFaux:因为十六进制的 A 是二进制的 1010。
  • 这个问题是在开玩笑吗?
  • 它是一个常数,为什么要“构造”它?

标签: bit-manipulation


【解决方案1】:

只需读取 4 到 4 位并将它们视为十六进制:

您的号码只是 0xAAAAAAAAA。

【讨论】:

    【解决方案2】:

    在固定位数的情况下,这有点明显……

    但是对于可变位数,可以通过整数除法获得这种模式,如下所示http://smallissimo.blogspot.fr/2011/07/revisiting-sieve-of-erathostenes.html

    编辑更详细的解释如下:

    这个想法是:

    2r01 * 2r11 -> 2r11
    2r0101 * 2r11 -> 2r1111
    2r010101 * 2r11 -> 2r111111
    

    所以反过来,我们可以应用一个精确的除法:

    2r111111 / 2r11 -> 2r010101
    

    如果我们想要2r101010 而不是2r010101,只需再添加 1 位(但除法不精确,我假设商由 // 给出,就像在 Smalltalk 中一样):

    2r1111111 // 2r11 -> 2r101010
    

    2r1111111很容易构造,是2减1的幂,2^7-1,也可以通过位移得到(1<<7)-1

    在你的情况下,你的常量是((1<<33)-1)//3,或者如果你用 C/C++ 编写它((1ULL<<33)-1)/3
    (在 Smalltalk 中我们不关心整数长度,它们的长度是任意的,但在大多数情况下语言,我们必须确保操作数符合原生整数长度)。

    请注意,除法也适用于较长长度的位模式,如2r100100100,除以2r111,对于长度为p的位模式,除以2^p-1,即(1<<p)-1

    【讨论】:

    • 这不是问题。
    • @RamonSnir 问题是如何构造,所以这可能是一个答案,虽然我同意,如果模式是固定长度的答案是无用的
    • 至少总结一下公式(2^64-1)*2/3(文章很长,大多无关紧要)。但问题是关于固定大小。我不会说这个“技巧”不适用于所有二的幂,只适用于偶数。
    • @RamonSnir 是的,这是一个懒惰的答案,因为计算常数太多了!但是文章是相关的,算法的本质正是这个比特除法的性质,它就在文章的开头。我现在编辑以确保没有误解,该算法应该适用于任何位长度。
    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多