PHP中的翻转位
好的,问题是: 您将获得一个文件中32位无符号整数的列表以供读取。您需要输出通过在二进制表示中翻转位获得的无符号整数列表(即,必须设置未设置位,并且必须设置未设置位) 示例输入为:PHP中的翻转位,php,bit-manipulation,Php,Bit Manipulation,好的,问题是: 您将获得一个文件中32位无符号整数的列表以供读取。您需要输出通过在二进制表示中翻转位获得的无符号整数列表(即,必须设置未设置位,并且必须设置未设置位) 示例输入为: 3 2147483647 1 0 样本输出为: 2147483648 4294967294 4294967295 其中,输入中的3是行数 <?php $_fp = fopen("php://stdin", "r"); /* Enter your code here. Read input from STD
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"
您说过“必须设置未设置的位,并且必须设置未设置的位”。这是使用1
对每个数字的每一位进行运算的结果
守则应改为:
for($i=0;$i<$t;$i++){
$line = fgets($_fp);
echo(($line ^ 0xFFFFFFFF)."\n"); # 32-bit full of '1'
}
对于($i=0;$i您可以尝试该代码
<?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);
?>
当你说“设置位”时,你是说1吗?是的,unset表示0,你只是想把所有的1都变成0,把所有的0都变成1?以1为例,因为无符号32位是00000000000000000000000001,进行翻转我们得到111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111XOR真值表输入输出A B 0 0 0 0 0 0 1 1 1 1 1 1 0XOR
表示“一个或另一个,但不能同时两个”。从真值表中可以看出0
是中性元素(使用XOR
组合时无效)而1
将0
转换为1
并将1
转换为0
。这种行为正是我在回答中引用的问题的片段(以斜体显示)。:-)即“翻转运算符”被称为XOR,从字符串创建掩码也是真正的过度使用。一个简单的1