bufannao
V2EX  ›  问与答

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

  •  
  •   bufannao · Jun 6, 2015 · 4374 views
    This topic created in 4173 days ago, the information mentioned may be changed or developed.
    21 replies  •  2015-06-07 10:00:25 +08:00
    Xs0ul
    Xs0ul
    Jun 6, 2015 via Android
    1
    看看十进制整数转换为二进制的算法
    wbingeek
    wbingeek
    Jun 6, 2015
    2
    除二取余
    hpeng
    hpeng
    Jun 6, 2015 via Android
    3
    算二进制位数的1。位运算即可
    bufannao
    bufannao
    OP
    Jun 6, 2015
    4
    能给个算法么?
    function count($num){
    // $num = 13
    ……
    return $result; // array[1,4,8]
    }
    bufannao
    bufannao
    OP
    Jun 6, 2015
    6
    @zhjits 没想好怎么把1101计算出是8,4,1,而把1001计算出是8,1
    ebony0319
    ebony0319
    Jun 6, 2015 via Android
    7
    @wbingeek 二楼正解,因为可能还有其余的结果,比如1'2'3'4'5
    ebony0319
    ebony0319
    Jun 6, 2015 via Android
    8
    说错了,但是二楼是正解
    wy315700
    wy315700
    Jun 6, 2015❤️1
    9
    $i = 1;
    $result = array();
    while($num){
    if($num & 1){
    $result[] = $i;
    }
    $i *= 2;
    $num /= 2;
    }
    zyue
    zyue
    Jun 6, 2015
    10
    不就是转为二进制么
    zhs227
    zhs227
    Jun 6, 2015❤️1
    11
    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
    SoloCompany
    Jun 6, 2015 via iPad❤️1
    12
    toString(2)
    b821025551b
    b821025551b
    Jun 6, 2015
    13
    加号写成按位与也是醉了,我反应半天才反应过来
    imn1
    imn1
    Jun 6, 2015
    14
    换成二进制,看哪位有1就知道了
    这是用整数作为权限表常见方法
    bufannao
    bufannao
    OP
    Jun 6, 2015 via Android
    15
    @b821025551b 嗯,是写错了
    @zhs227 自己其实之前有写过代码,用的for循环,总感觉效率不高,看了大家的收益了
    bufannao
    bufannao
    OP
    Jun 6, 2015 via Android
    16
    @imn1 用在多选题选项上了
    Jaylee
    Jaylee
    Jun 6, 2015
    17
    求子集
    xff1874
    xff1874
    Jun 6, 2015
    18
    1 先排序
    2 用贪婪算法
    327beckham
    327beckham
    Jun 7, 2015
    19
    算法的话,加减乘除的速度有点慢了。用位运算的方式来弄吧。
    msg7086
    msg7086
    Jun 7, 2015
    20
    发个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]
    msg7086
    msg7086
    Jun 7, 2015
    21
    或者写成one line的话

    bin = -> (n) {Enumerator.new{|e| while n > 0 do m, n = n, n & (n-1); e.yield m - n end}.to_a}

    p bin.call 15 #-> [1, 2, 4, 8]
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   656 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 18:33 · PVG 02:33 · LAX 10:33 · JFK 13:33
    ♥ Do have faith in what you're doing.