1

私はこの番号を持っています:

0101

そして私はそれがの2進和であることを知っています

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)

はintを返すので$value & $bit(のように0以外の場合もあります6 & 3)、そのため私は使用できませんif ($value & $bit)

皆様のご協力に感謝いたします。

2おっと編集!ちょっとしたバグがありました...$xXDを増やすのを忘れました

4

4 に答える 4

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);
}
于 2012-05-22T23:43:54.610 に答える
1

JoeCortopassiのコードを使用する:

$value= bindec($binary);
$sums=array();
$counter=1;
while($counter<=$value){
    if($counter & value)
        $sums[]=$counter;
    $counter*=2;
}
print_r($sums);
于 2012-05-23T00:13:51.733 に答える
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}} *) 

2進数のリストを取り、数字の値のリストを返す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} *)
于 2012-05-23T00:29:04.603 に答える
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");
    }
}
于 2012-05-23T03:10:41.063 に答える