【发布时间】: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