在 PHP 中翻转位

Flipping bits in PHP

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

样本输入是:

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);
?>

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

使用 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"

你说的是"unset bits must be set, and set bits must be unset"。这是 XOR-ing 每个数字的每一位与 1.

的结果

代码应为:

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

你可以试试那个代码

<?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);
?>