Хорошо, проблема в том, что:
Вам будет предоставлен список 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);
?>
Как это не так? И должен ли я использовать вместо этого побитовые операторы?
Вы сказали «должны быть установлены неустановленные биты, а установленные биты должны быть не установлены». Это результат XOR
-каждый бит каждого числа с 1
,
Код должен читать:
for($i=0;$i<$t;$i++){
$line = fgets($_fp);
echo(($line ^ 0xFFFFFFFF)."\n"); # 32-bit full of '1'
}
Создать маску с 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"
Вы можете попробовать этот код
<?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);
?>