Bitwise operators 位运算和数字列表

Bitwise operators 位运算和数字列表,bitwise-operators,Bitwise Operators,我正在寻找一组8个小于或等于128(2^7)的数字,其中每对数字仅在4位位置不同。例如(一个较短的版本):考虑一组4个数字,考虑小于或等于8的数字,在2位的位置不同的是1, 2, 4,8。 更一般地说,有任何算法(伪代码)可以帮助我找到所需的n个数的组(n始终为偶数),其中每个数都小于2^(n-1),并且每对数的差异正好为n/2位。我们可以假设n一组8个小于128的数字,其中每对数字仅在4位位置不同,将是0、15、51、60、85、90、102、105。即: 00000000 (0) 00001

我正在寻找一组8个小于或等于128(2^7)的数字,其中每对数字仅在4位位置不同。例如(一个较短的版本):考虑一组4个数字,考虑小于或等于8的数字,在2位的位置不同的是1, 2, 4,8。
更一般地说,有任何算法(伪代码)可以帮助我找到所需的n个数的组(n始终为偶数),其中每个数都小于2^(n-1),并且每对数的差异正好为n/2位。我们可以假设n一组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位,在最后4位中翻转2位。为了按升序查找数字,我们翻转位3和4,并选择最后4位与前4位匹配。也就是说,位1-4现在是
0011
,我们将位5-8设置为匹配,我们发现组中下一个最小的数字是
00110011(51)

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

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

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

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

编辑:查看数字的前半部分,我们将前4位选为
0000
。然后,因为我们希望在这一半的数字中有两个不同的位,所以我们先是
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位),您可能会找到足够的数字,但我在找到一致可靠的方法来查找更多这些数字时遇到了问题,因为它们也必须以正确的位数与其他数字中的每一个不同。

一组小于128的8个数字,其中每对数字仅在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位,在最后4位中翻转2位。为了按升序查找数字,我们翻转位3和4,并选择最后4位与前4位匹配。也就是说,位1-4现在是
0011
,我们将位5-8设置为匹配,我们发现组中下一个最小的数字是
00110011(51)

注意:我们任意设置位5-8以匹配位1-4,因为这是确保每个数字彼此之间仅相差4位的最简单方法。数字的前半部分不会重复,除了我们翻转后半部分中的所有位的那一次之外,因此后半部分也总是与其他数字的正确位数不同。其他方法也应该有效,只要您能够跟踪