在PHP中翻转位

时间:2015-01-16 08:27:07

标签: php bit-manipulation

好的,问题是: 您将获得一个要读取的文件中的32位无符号整数列表。您需要通过在其二进制表示中翻转位来输出您获得的无符号整数的列表(即必须设置未设置的位,并且必须取消设置位)。

Sample输入为:

3
2147483647
1
0

示例输出为:

2147483648
4294967294
4294967295

输入中的3是行数。

<?php

$_fp = fopen("php://stdin", "r");
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
$t = fgets($_fp);


for($i=0;$i<$t;$i++){
    $line = fgets($_fp);
    $binLine = decbin($line);
    $reverse = strrev($binLine);
    echo bindec($reverse)."\n";
}

fclose($_fp);
?>

这怎么回事?我应该使用按位运算符吗?

3 个答案:

答案 0 :(得分:2)

你说“必须设置未设置的位,并且必须取消设置位”。这是XOR的结果 - 每个数字的每一位都带有1

代码应为:

for($i=0;$i<$t;$i++){
    $line = fgets($_fp);
    echo(($line ^ 0xFFFFFFFF)."\n");       # 32-bit full of '1'
}

答案 1 :(得分:0)

使用bindec(str_repeat("1", 32))创建遮罩并应用翻转运算符^

decbin(2147483648^bindec(str_repeat("1", 32))) # "1111111111111111111111111111111"

对于具有较低值的整数,如果需要将它们转换为32位整数,则可以使用sprintf

sprintf('%032d', 1) # "00000000000000000000000000000001"
decbin(sprintf('%032d', 1)^bindec(str_repeat("1", 32))) # "11111111111111111111111111111110"

答案 2 :(得分:0)

您可以试用该代码

<?php
$bin = sprintf( "%032d", decbin( 0 ));
$out = "";
for( $i = 0; $i < strlen($bin); $i++ ) {
    $char = substr( $bin, $i, 1 );
    $out .= ($char == 1 ) ? 0 : 1;
}
$dec = bindec($out);
print($out."\n");
print($dec);
?>