我想生成一個帶m數字的二進制數串列,其中n位設定為 1,所有其他設定為 0。例如,假設 m 是 4。我想生成一個 4 位的二進制數串列。在這 16 個數字中,有 6 個數字的 2 位設定為 1,其他數字都為 0。
0000
0001
0010
0011 <--
0100
0101 <--
0110 <--
0111
1000
1001 <--
1010 <--
1011
1100 <--
1101
1110
1111
我想為位設定為 1 的任何m位生成一個串列,n至少對于 where n= 2的情況。但我不確定要遵循什么程序。我當然可以蠻力它并生成所有m位數字,然后單獨檢查每個數字,但對于可能需要一段時間的大量位。我覺得必須有一個更簡潔的數學技巧來找出答案。
我很感激任何關于從哪里開始的指示。我不介意答案是偽代碼還是任何語言,只要它們清晰即可。
XY問題
我正在嘗試解決棋盤上有兩個棋子的國際象棋問題。首先,我試圖在棋盤上生成兩個棋子的所有有效組合,我打算通過將棋盤視為 64 位二進制數 (0000 0000 0000 0000 .. 0011) 來實作,其中一個位是一塊。為此,我需要找到一種優雅的方法來生成二進制數串列。
編輯:我已經嘗試在 Python 中實作樸素演算法只是為了演示。在我的 VS Code 上執行 m = 64 需要很長時間,所以絕對不是最好的解決方案:
n = 2
m = 64
combos = []
for i in range(2 ** m):
bin_s = str(format(i, f'0{m}b'))
if bin_s.count('1') == n:
combos.append(bin_s)
for c in combos:
print(c)
print(f"There are {len(combos)} combinations")
uj5u.com熱心網友回復:
這被稱為按字典順序排列的下一個排列,它在許多位黑客站點中可用。
https://graphics.stanford.edu/~seander/bithacks.html#NextBitPermutation
從x = 0b000000111例如 3 位開始,一個迭代直到x & (1 << m)(或者如果存在溢位m == word_size)。
uint64_t next(uint64_t v) {
uint64_t t = v | (v - 1); // t gets v's least significant 0 bits set to 1
// Next set to 1 the most significant bit to change,
// set to 0 the least significant ones, and add the necessary 1 bits.
return (t 1) | (((~t & -~t) - 1) >> (__builtin_ctz(v) 1));
}
uint64_t v = 15; // 4 bits
do {
my_func(v);
if (v == 0xf000000000000000ull) {
break;
}
v = next(v);
} while (true);
uj5u.com熱心網友回復:
使用https://docs.python.org/3/library/itertools.html#itertools.combinations來生成索引集,在那里你有一個 1。把它變成一個二進制數很簡單。
如果你想用另一種語言,檔案有原生的 Python 代碼來解決這個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/369660.html
上一篇:C如何列印陣列指標的索引
下一篇:把最值錢的東西放在一個盒子里
