如何将整数表示为两个幂的总和?

时间:2012-05-22 23:32:23

标签: php math logarithm

我有这个号码:

0101

我知道它是

的二进制和
0100
0001

如何从第一个中获取这些值?

修改

我已根据JoeCortopassi的逻辑创建了一段代码。摘录如下:

protected function _getSitesPublished($value) {
    static $bits = null;
    if (!$bits) {
        $bits = array ();
        $bit = 0;
        $x = 0;
        while ($bit < 4294967295) {
            $bit = pow (2, $x);
            $bits [$bit] = $bit;
                            ++ $x;
        }
    }
    $sites = array ();
    foreach ($bits as $bit) {
        if (($value & $bit) == $bit) {
            $sites [] = $bit;
        }
    }
    return $sites;
}

它只在第一次调用方法时创建位。我必须做出反应

if (($value & $bit) == $bit)

因为$value & $bit将返回一个int(可能不是0,如6 & 3中所示),因此我不能只使用if ($value & $bit)

感谢大家的帮助。

编辑2 哎呀!我有一个小bug ......忘了增加$ x XD

4 个答案:

答案 0 :(得分:2)

$values = bindec('0101');

$bar  = 1; // 0001
$fizz = 2; // 0010
$foo  = 4; // 0100
$baz  = 8; // 1000


if ( $values & $bar )
{
   //returns true
}

if ( $values & $fizz )
{
   //returns false
}

if ( $values & $foo )
{
   //returns true
}

if ( $values & $baz )
{
   //returns false
}

修改

这更像是你在寻找什么?现在无法运行它来测试,但它应该传达消息:

function bitCheck($original, $num, $return)
{
    if ( $num == 0 )
    {
        return $return;
    }

    if ($original & $num)
    {
        $return[] = $num;
    }


    return bitCheck($original, $num-1,$return);
}

答案 1 :(得分:1)

使用JoeCortopassi的代码:

$value= bindec($binary);
$sums=array();
$counter=1;
while($counter<=$value){
    if($counter & value)
        $sums[]=$counter;
    $counter*=2;
}
print_r($sums);

答案 2 :(得分:1)

Mathematica解决方案:

k[number_] := 
 ReplacePart[ConstantArray[0, Length@number], # -> 1] & /@ 
 (Position[number, 1] // Flatten)

给出二进制输入的单个位组件的列表:

(* k[{1, 0, 1, 1, 0}] ->  {{1, 0, 0, 0, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 1, 0}} *) 

Mathematica解决方案,它采用二进制数字列表并返回数字值列表。

   Clear[s];
    Options[s] := {Base -> 2, Totalled -> False};
    s[number_, OptionsPattern[]] := 
     With[{digitVals = 
        Reverse@Flatten@
           NestList[# OptionValue@Base &, {1}, Length@number - 1] number},
       If[OptionValue@Totalled, Total@digitVals, digitVals]]


(* s[{1, 0, 1, 0, 1}] -> {16, 0, 4, 0, 1} *)

答案 3 :(得分:0)

以下适用于java,您可以在php或mathematica中使用类似的逻辑:

public class IntAsPowerOfTwo {

    public static void main(String[] args) {
        printIntAsSumPowerOf2(256);
        printIntAsSumPowerOf2(15);
        printIntAsSumPowerOf2(-1023);
    }

    /**
     * Prints an integer as sum of powers of 2.
     * 
     * @param valueToEvaluate
     */
    public static void printIntAsSumPowerOf2(int valueToEvaluate) {
        if (valueToEvaluate < 0) {
            System.out.println("Integer to evaluate must be non negative.");
        }

        int runningValue = valueToEvaluate;
        int currPower = 0;

        // Increase until larger than current value.
        while (Math.pow(2, currPower) < runningValue) {
            currPower++;
        }

        // Output sum of power of 2s.
        boolean firstOutput = true;
        while (currPower >= 0) {
            if (runningValue >= Math.pow(2, currPower)) {
                if (firstOutput) {
                    System.out.print(valueToEvaluate + " = 2^" + currPower);
                    firstOutput = false;
                } else {
                    System.out.print(" + 2^" + currPower);
                }
                runningValue = runningValue - (int) Math.pow(2, currPower);
            }
            currPower--;
        }
        System.out.print("\n");
    }
}