求算法, 1,2,4,8,16…………,给出任意数如 15,如何计算出 15 是由 1, 2, 4, 8 相加得到的?即 15=1&2&4&8,而 13=1&4&8

2015 年 6 月 6 日
 bufannao
4061 次点击
所在节点    问与答
21 条回复
Xs0ul
2015 年 6 月 6 日
看看十进制整数转换为二进制的算法
wbingeek
2015 年 6 月 6 日
除二取余
hpeng
2015 年 6 月 6 日
算二进制位数的1。位运算即可
bufannao
2015 年 6 月 6 日
能给个算法么?
function count($num){
// $num = 13
……
return $result; // array[1,4,8]
}
zhjits
2015 年 6 月 6 日
bufannao
2015 年 6 月 6 日
@zhjits 没想好怎么把1101计算出是8,4,1,而把1001计算出是8,1
ebony0319
2015 年 6 月 6 日
@wbingeek 二楼正解,因为可能还有其余的结果,比如1'2'3'4'5
ebony0319
2015 年 6 月 6 日
说错了,但是二楼是正解
wy315700
2015 年 6 月 6 日
$i = 1;
$result = array();
while($num){
if($num & 1){
$result[] = $i;
}
$i *= 2;
$num /= 2;
}
zyue
2015 年 6 月 6 日
不就是转为二进制么
zhs227
2015 年 6 月 6 日
php有现成的函数转二进制。话说直接求代码真是个不好的方式,至少这个问题很简单。

function count_a($num) {
$result = [];
foreach (array_reverse(str_split(decbin($num))) as $k=>$v ) {
if ($v) {
$result[] = 1<<$k;
}
}
return $result; // array[1,4,8]
}
SoloCompany
2015 年 6 月 6 日
toString(2)
b821025551b
2015 年 6 月 6 日
加号写成按位与也是醉了,我反应半天才反应过来
imn1
2015 年 6 月 6 日
换成二进制,看哪位有1就知道了
这是用整数作为权限表常见方法
bufannao
2015 年 6 月 6 日
@b821025551b 嗯,是写错了
@zhs227 自己其实之前有写过代码,用的for循环,总感觉效率不高,看了大家的收益了
bufannao
2015 年 6 月 6 日
@imn1 用在多选题选项上了
Jaylee
2015 年 6 月 6 日
求子集
xff1874
2015 年 6 月 6 日
1 先排序
2 用贪婪算法
327beckham
2015 年 6 月 7 日
算法的话,加减乘除的速度有点慢了。用位运算的方式来弄吧。
msg7086
2015 年 6 月 7 日
发个ruby的好了

def bin n
l = []
while n > 0 do m, n = n, n & (n-1); l << m - n end
l
end

p bin 15 #-> [1, 2, 4, 8]

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/196468

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX