PHP翻转32位整数

3
获取32位无符号整数。翻转所有位(0变1,1变0),并将结果作为无符号整数返回。
以1为例,无符号32位数值为00000000000000000000000000000001,进行翻转后得到11111111111111111111111111111110,即4294967294。
我能将十进制数转换为二进制,但它不包含32位以进行翻转。 请帮我解决这个问题。

1
假设$d=10; 我想将其转换为32位二进制并翻转(0-> 1,1-> 0)。然后我需要从PHP中获取其十进制值。 - Hashan
3
也许 echo sprintf('%032b', 4294967294); 可以作为你的起点。 - user3783243
1
我想用PHP来实现这个。 - Hashan
2
user3783243,是的,你使用sprintf(用于字符串操作添加前导零)的建议,在PHP官方文档的decbin中已经明确说明。谢谢。 - Ken Lee
5个回答

3

谢谢大家,我已经做到了。下面是我的做法。

$function flippingBits($n) { 
    $binary = sprintf('%032b', $n);
    $fliped = strtr($binary, [1,0]);
    return bindec($fliped);
}

2
太棒了!愉快地编程吧,兄弟。 - Ken Lee

0

对于 PHP,您可以使用 decbin 和 bindec 分别进行十进制到二进制和二进制到十进制的转换,并使用一个简单的函数来反转位。

我已经编写了一个名为 xinvert 的函数来完成这项工作,如下所示:

<?php
$value1=10;
echo xinvert($value1) ."<br>";

function xinvert($value1){
$string1= sprintf( "%032d",decbin($value1));
$index=0;
$string2="";
  while ($index < strlen($string1) ) {
   if (substr($string1, $index,1)=="0"){
     $string2.="1";
       }else{
     $string2.="0";
    }
   $index++;
   }
return bindec($string2);
}
?>

注意:我使用了sprintf("%032d",decbin($value1));来使其长度达到32位,这是受到user3783243的启发。

0

这是一个非常基础的编程问题;任何使用字符串处理的人都不是你想要学习的对象。

话虽如此,pack()是一个很好的函数;但它并不能帮助我们理解到底发生了什么。

要反转32位值,让我们考虑一下PHP中的int。首先,int是64位的;但没关系,我们也可以使用掩码来确保我们得到预期的答案(即使PHP更改了默认的int宽度)。

$value = some_int_value; // the value to invert
$value = !$value; // flip all 64 bits
$value = $value & 0xffffffff; // ignore anything but the last 32 bits

更简洁地说
$invert_32_unsigned = 0xffffffff & !intval($value);

1
这位绅士要两杯啤酒。 - user1597430
另一个选项是 $result = ~$number & 0xffffffff - user1597430
1
当然可以,但是这种写法没有漂亮的三步扩展;不过在实际生产中,这就是我会写的方式。 - haxbits

0

这可以通过一个二进制操作实现:异或

echo $v ^ 0xffffffff;

-1

这是编程的基础知识,PHP具有完整的位运算符支持,包括按位取反:

$result = unpack('V', ~pack('V', 1234))

在这里使用了Pack和Unpack来处理PHP中所有整数都是带符号64位整数的事实。不要听那些将4字节数字转换为字符串或字符串数组的人,他们不知道自己在做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接