我正在學習如何在 Javascript 中列印具有相同長度的所有子集。我在 w3resource.com 上看到了這個解決方案:
JavaScript 函式:練習 21 及解決方案
撰寫一個 JavaScript 函式以獲取陣列中具有固定長度(例如 2 個)組合的所有可能子集。
樣本陣列:
[1, 2, 3]子集長度為 2預期輸出:
[[2, 1], [3, 1], [3, 2], [3, 2, 1]]JavaScript 代碼:
function subset(arra, arra_size) { var result_set = [], result; for(var x = 0; x < Math.pow(2, arra.length); x ) { result = []; i = arra.length - 1; do { if( (x & (1 << i)) !== 0) { result.push(arra[i]); } } while(i--); if( result.length >= arra_size) { result_set.push(result); } } return result_set; }
但是我不明白代碼背后的邏輯,尤其是按位運算子的行。誰能解釋一下?
uj5u.com熱心網友回復:
(x & (1 << i)) !== 0表示“第 th 位是否x設定i為1?”
一個例子:
假設x在二進制表示中是 1001101
然后i從 6 降到 0(這就是do回圈的作用)
然后我們得到:
i |
1 << i(二進制) |
x & (1 << i)(二進制) |
|---|---|---|
| 6 | 1000000 | 1000000 |
| 5 | 100000 | 0 |
| 4 | 10000 | 0 |
| 3 | 1000 | 1000 |
| 2 | 100 | 100 |
| 1 | 10 | 0 |
| 0 | 1 | 1 |
外部回圈將生成所有可能的二進制位模式,其位數與陣列中的值一樣多。
這樣,這些位模式 ( x) 實際上描述了陣列的所有可能子集(1 位表示:包含相應的陣列值,0 表示:不包含它)。移位運算子有助于隔離位模式中的一位,從而決定是否包含相應的陣列值。
有關按位與 ( &)和左移 ( )的檔案,請參閱 MDN<<
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/467435.html
標籤:javascript 数组 位操作 子集
