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

2015-06-06 08:16:13 +08:00
 bufannao
3443 次点击
所在节点    问与答
21 条回复
Xs0ul
2015-06-06 08:18:59 +08:00
看看十进制整数转换为二进制的算法
wbingeek
2015-06-06 08:20:31 +08:00
除二取余
hpeng
2015-06-06 08:26:47 +08:00
算二进制位数的1。位运算即可
bufannao
2015-06-06 08:27:44 +08:00
能给个算法么?
function count($num){
// $num = 13
……
return $result; // array[1,4,8]
}
zhjits
2015-06-06 08:29:09 +08:00
bufannao
2015-06-06 08:38:22 +08:00
@zhjits 没想好怎么把1101计算出是8,4,1,而把1001计算出是8,1
ebony0319
2015-06-06 08:43:42 +08:00
@wbingeek 二楼正解,因为可能还有其余的结果,比如1'2'3'4'5
ebony0319
2015-06-06 08:45:25 +08:00
说错了,但是二楼是正解
wy315700
2015-06-06 08:46:20 +08:00
$i = 1;
$result = array();
while($num){
if($num & 1){
$result[] = $i;
}
$i *= 2;
$num /= 2;
}
zyue
2015-06-06 10:31:43 +08:00
不就是转为二进制么
zhs227
2015-06-06 10:36:56 +08:00
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-06-06 11:35:45 +08:00
toString(2)
b821025551b
2015-06-06 11:45:11 +08:00
加号写成按位与也是醉了,我反应半天才反应过来
imn1
2015-06-06 12:13:42 +08:00
换成二进制,看哪位有1就知道了
这是用整数作为权限表常见方法
bufannao
2015-06-06 13:07:18 +08:00
@b821025551b 嗯,是写错了
@zhs227 自己其实之前有写过代码,用的for循环,总感觉效率不高,看了大家的收益了
bufannao
2015-06-06 13:09:10 +08:00
@imn1 用在多选题选项上了
Jaylee
2015-06-06 13:47:37 +08:00
求子集
xff1874
2015-06-06 16:38:21 +08:00
1 先排序
2 用贪婪算法
327beckham
2015-06-07 01:03:13 +08:00
算法的话,加减乘除的速度有点慢了。用位运算的方式来弄吧。
msg7086
2015-06-07 09:54:12 +08:00
发个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://www.v2ex.com/t/196468

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

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

© 2021 V2EX