在 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);
?>
好的,问题是: 您将获得文件中的 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);
?>