【问题标题】:finding Bit positions that devide a node into 4 nodes查找将节点划分为 4 个节点的位位置
【发布时间】:2019-11-22 21:06:19
【问题描述】:

我有一个根节点 (S1),其范围值为 1073741824(最小值)、2147483648(最大值)。我将此范围划分为 4 个相等的范围,代表 4 个新生成的节点。子节点的范围分别为(S2)1073741824(最小)、1342177280(最大);对于(S3)1342177280(最小)、1610612736(最大) ;对于 (S4) 1610612736 (min), 1879048192 (max);对于 (S5) 1879048192 (min), 2147483648 (max)。所有数字的长度都是 32 位。附图可以更清楚地说明:

  (S1) 1073741824 (min), 2147483648 (max)
  (S2) 1073741824 (min), 1342177280 (max)
  (S3) 1342177280 (min), 1610612736 (max)
  (S4) 1610612736 (min), 1879048192 (max)
  (S5) 1879048192 (min), 2147483648 (max)

  [Spawning 4 nodes from one node][1]

在二进制中,边界是

S1 min = S2 min = 1073741824 = 01000000000000000000000000000000_bin
S2 max = S3 min = 1342177280 = 01010000000000000000000000000000_bin
S3 max = S4 min = 1610612736 = 01100000000000000000000000000000_bin
S4 max = S5 min = 1879048192 = 01110000000000000000000000000000_bin
S5 max = S1 max = 2147483648 = 10000000000000000000000000000000_bin
                 

因此,如果数字以二进制表示,有没有办法找到将原始范围(1073741824(最小)、2147483648(最大))划分为 4 的位位置(从第 0 位位置到第 31 位位置)大小团体?有什么算法可以做到这一点吗? 例如我想找到 'i', 'j' 位位置 (0

【问题讨论】:

  • 在您的示例中,您必须修改 4 位(请参阅我的编辑)。可以通过简单的方法计算所有边界,然后将它们组合起来,使得只有改变的位在结果中保持设置,可以找出要修改的位。然后可以提取这些位的位置 - 如果您对此感兴趣,我可以创建一个答案。
  • S1 有什么限制?在您的示例中,S1_min 是 2 的幂,S1_max = 2 * S1_min。如果情况总是如此,那么操作 S1_min 中(唯一)设置位右侧的两位就足够了。如果 S1_min 和 S1_max 具有任意值,那么您基本上需要计算 S1_min + (S1_max - S1_min) / 4,这会影响许多(甚至所有)位。
  • Socowi,您所说的“更改位保持设置”是什么意思?这 4 位是基于您的答案的最高有效位。 (b31.b30,b29,b28)。如果每个节点只考虑最小值,你不认为 b28 和 b29 就足够了吗?我对你的回答很感兴趣
  • cătălin frâncu,S1 的最小值和最大值始终是 2 的幂,但 S1_max 并不总是等于 2*S1_min。例如,在这种情况下,切割的数量是 4,也将是 2 的幂。
  • 抱歉,回答迟了。我没有收到关于您的评论的通知。如果您与用户联系,请确保写 @user 而不是只写 user 以便用户收到通知。

标签: python algorithm tree bit-manipulation


【解决方案1】:

总体思路……

到 S2,S3,S4,S5 的分支动作可以表示为 ij=00,01,10,11

... 对我来说似乎是过早的优化。特别是因为您使用的 python 开始时速度并不快。但是,如果您出于其他原因想要提取这些位,这是一种方法。请记住,在您的示例中,两位是不够的。

可以通过简单的方法计算所有边界,然后将它们组合起来,以便在结果中只保留更改的位,从而找出要修改的位。

#! /usr/bin/python3
min = 1073741824
max = 2147483648

# divide in the straight-forward way
diff = max - min
bounds = [min + i*diff//4 for i in range(5)]

# combine bounds such that only the changing bits remain set
changingBits = 0
for x in bounds:
    for y in bounds:
        changingBits |= x ^ y

print('bounds:')
for b in bounds:
    print('{0:010d} {0:032b}'.format(b))
print()
print('changing bits:')
print(' '*11 +  '{0:032b}'.format(changingBits))

这将打印出来

bounds:
1073741824 01000000000000000000000000000000
1342177280 01010000000000000000000000000000
1610612736 01100000000000000000000000000000
1879048192 01110000000000000000000000000000
2147483648 10000000000000000000000000000000

changing bits:
           11110000000000000000000000000000

请注意,对于任意数字minmax,您可以获得不连续的更改位。这是min=3max=82589933 的示例。

bounds:
0000000003 00000000000000000000000000000011
0020647485 00000001001110110000111000111101
0041294968 00000010011101100001110001111000
0061942450 00000011101100010010101010110010
0082589933 00000100111011000011100011101101

changing bits:
           00000111111111110011111011111111

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多