управление битами — переключение битов в переполнении стека

Хорошо, проблема в том, что:
Вам будет предоставлен список 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);
?>

Как это не так? И должен ли я использовать вместо этого побитовые операторы?

0

Решение

Вы сказали «должны быть установлены неустановленные биты, а установленные биты должны быть не установлены». Это результат XOR-каждый бит каждого числа с 1,

Код должен читать:

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

Другие решения

Создать маску с 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"
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);
?>
0