7 回答

aluckdog
TA貢獻1847條經驗 獲得超7個贊
不熟悉php。可以先確定這個數占多少位,比如64或者32等。然后再左移位,按位與來解決。寫了個python的。xrange的意思是從64開始遞減到0,每次遞減1.
這里假定是64位,符號位就不考慮了。
dest_num = 11
for i in xrange(64, -1, -1):
n = 1 << i
r = n & dest_num
if r != 0:
print r
應該很容易改造成php的。

慕村225694
TA貢獻1880條經驗 獲得超4個贊
其實你要就是一個數字的二進制表示
比如
15實際上是1111, 最右邊1是12^0=1, 從右向左第二個是12^1=2, 第三個是12^2=4, 第四個是12^3=8
22用二進制是10110, 02^0+12^1+12^2+02^3+1*2^4 = 0+2+4+0+16 = 22
整數到二進制的做法是用除二法
22/2 = 11 ..... 0
11/2 = 5 ..... 1
5/2 = 2 ..... 1
2/2 = 1 ..... 0
1/2 = 0 ..... 1
一直除到為0, 余數10110就是它的二進制數

開滿天機
TA貢獻1786條經驗 獲得超13個贊
15 的二進制是:1111
1 的二進制是:0001
2 的二進制是:0010
4 的二進制是:0100
8 的二進制是:1000
看懂了嗎?或
運算就是把對應位置的1
組合到一起。

PIPIONE
TA貢獻1829條經驗 獲得超9個贊
Javascript版的算法:
function split(n) {
n = n|0; // 將浮點數n轉化為正整數
let pad = 0;
const arr = []; // 用于保存結果的數組
while(n) {
if (n&1) arr.push(1<<pad);
pad++;
n >>= 1;
}
return arr;
}
對應的 PHP 版本:
function split($n) {
$n |= 0;
$pad = 0;
$arr = array();
while ($n) {
if ($n & 1) array_push($arr, 1 << $pad);
$pad++;
$n >>= 1;
}
return $arr;
}

30秒到達戰場
TA貢獻1828條經驗 獲得超6個贊
def decrypt(n):
arr = []
i = 0
while n > 0:
x = n % 2
n >>= 1
if x == 1:
arr.append(i)
i += 1
return arr
- 7 回答
- 0 關注
- 667 瀏覽
添加回答
舉報
0/150
提交
取消