我有这个号码:
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
答案 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");
}
}