Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的翻转位_Php_Bit Manipulation - Fatal编程技术网

PHP中的翻转位

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

好的,问题是: 您将获得一个文件中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"
您说过“必须设置未设置的位,并且必须设置未设置的位”。这是使用
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 0
XOR
表示“一个或另一个,但不能同时两个”。从真值表中可以看出
0
是中性元素(使用
XOR
组合时无效)而
1
0
转换为
1
并将
1
转换为
0
。这种行为正是我在回答中引用的问题的片段(以斜体显示)。:-)即“翻转运算符”被称为XOR,从字符串创建掩码也是真正的过度使用。一个简单的1