按位运算和数字列表

时间:2015-09-12 08:55:33

标签: bitwise-operators

我正在寻找一个包含小于或等于128(2 ^ 7)的8个数字组的列表,其中每对数字仅在4位位置不同。例如(较短的版本):考虑一组4个数字,考虑小于或等于8的数字,2位位置的差异为1,2,4,8。

更普遍的是有任何算法(伪代码)帮助我找到所需的n个数组(n总是偶数),每个数小于2 ^(n-1)并且其中每对数字恰好n / 2位的位置不同。我们可以假设n <= 64。

编辑:另外,请告诉它根本不存在的偶数值。例如,对于n = 6,没有这样的解决方案。

2 个答案:

答案 0 :(得分:2)

一组8个小于128的数字,其中每对数字在4位位置上的差异仅为0,15,51,60,85,90,102,105。即:

00000000 (0)
00001111 (15)
00110011 (51)
00111100 (60)
01010101 (85)
01011010 (90)
01100110 (102)
01101001 (105)

我们以00000000 (0)为出发点。

由于数字在4位位置必须不同,我们可以翻转最后4位以查找组中的下一个数字00001111 (15)

要找到下一个数字,因为它必须与0和15相差4位,并且它们已经彼此相差4位,我们可以告诉我们需要在前4位和2中翻转2位下一个数字的最后4位中的位。为了按升序查找数字,我们翻转第3和第4位,并选择最后4位以匹配前4位。也就是说,位1-4现在是0011,我们将位5-8设置为匹配,我们发现组中的下一个最小数字为00110011 (51)

注意:我们任意设置位5-8以匹配1-4位,因为这是确保每个数字彼此相差仅4位的最简单方法。除了我们在后半部分翻转所有位时,数字的前半部分不再重复,因此后半部分总是与每个其他数字相差正确的位数。其他方法也应该起作用,只要你能跟踪你已经使用的模式并且不重复它们。

同样,我们可以简单地翻转最后4位以查找组中的下一个数字00111100 (60)

再次翻转数字的每一半中的位,我们将第1-4位设置为0101以获得下一个最低数字,并将第5-8位设置为匹配01010101 (85)

通过与上述相同的方法,我们可以在组中找到其余数字01011010 (90)01100110 (102)01101001 (105)

编辑:查看数字的前半部分,我们选择前4位为0000。然后,由于我们希望在该数字的一半中有2位不同,我们最多为0011,然后是0101,最后是0110。这些数字中的每一个都是次高的数字,只有两位设置为1.请注意,我们不能更高,因为下一个数字将以1001开头,而10010000已经是144,它高于128的给定限制。对于这些开始的一半,我们也选择后半部分与第一个相同的一个数字,然后将所有这些位翻转为第二个数字,找到两个每当我们找到可行的起始一半时,小组的数字。

此方法也应该在更通用的情况下工作,一次翻转n / 2位。如果要查找更大的数字组,可能需要编写程序来执行操作。但是,我还没有机会进行彻底的测试,但我相信这可能只适用于n为2的幂。

编辑2:我考虑的另一种可能性是,当n可以被4整除时,它可以工作。但是,上面使用的方法可能不太起作用,需要调整。我在翻转适当数量的位时遇到问题,同时确保每对数字仅与正确的位数不同。

例如,对于n = 12,使用上述方法,我们找到的一些第一个数字是:

000000000000 (0)
000000111111 (63)
000111000111 (455)
000111111000 (504)

Do not include:
001011001011 (715)  Differs from 455 by the incorrect number of bits
001011110100 (756)  Differs from 504 by the incorrect number of bits

问题是,我不认为只要应用上述方法,该组就有足够的数字。但是,如果你开始寻找数字的每一半中的比特差异不均匀的数字(例如,数字的前半部分中的2比特和数字中的4比特),则可能能够找到足够的数字。下半场),但我遇到了找到一致且可靠的方法来找到更多这些数字的问题,因为它们也必须通过正确的位数与每个其他数字不同。

答案 1 :(得分:1)