7 回答

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個贊
不熟悉php。可以先確定這個數(shù)占多少位,比如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
應(yīng)該很容易改造成php的。

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

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個贊
15 的二進(jìn)制是:1111
1 的二進(jìn)制是:0001
2 的二進(jìn)制是:0010
4 的二進(jìn)制是:0100
8 的二進(jìn)制是:1000
看懂了嗎?或
運(yùn)算就是把對應(yīng)位置的1
組合到一起。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個贊
Javascript版的算法:
function split(n) {
n = n|0; // 將浮點(diǎn)數(shù)n轉(zhuǎn)化為正整數(shù)
let pad = 0;
const arr = []; // 用于保存結(jié)果的數(shù)組
while(n) {
if (n&1) arr.push(1<<pad);
pad++;
n >>= 1;
}
return arr;
}
對應(yīng)的 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;
}

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超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 關(guān)注
- 657 瀏覽
添加回答
舉報