Написание немного перевернуть алгоритм
Я пытаюсь написать алгоритм для следующей задачи.
Постановка задачи.
Вам будет предоставлен список 32-битных целых чисел без знака. Вы должны вывести список целых чисел без знака, которые вы получаете, переворачивая биты в его двоичном представлении (т.е. должны быть установлены неустановленные биты, а установленные биты должны быть не установлены).
Код выглядит следующим образом:
def bit_flip(a):
return ~a & 0xffffffff
t = raw_input("")
a = map(int, t.split())
map(lambda x: x ^ 0xffffffff, a)
for i in a:
print bit_flip(int(i))
Вход
3
2147483647
1
0
Вывод, который я получаю 4294967292
в то время как выход должен быть
**2147483648
4294967294
4294967295**
Я не уверен, где я не прав. Выходные данные близки по крайней мере к одной строке выходных данных, но не совпадают.
2 ответа
Ваш вывод правильный. 32-разрядное беззнаковое дополнение 3
это действительно 4294967292
, Полный вывод вашей программы:
4294967292
2147483648
4294967294
4294967295
что правильно соответствует числам 3, 2147483647, 1, 0. Это легче увидеть, если написать их в шестнадцатеричном виде:
Dec Hex ~Hex ~Dec
3 3 FFFFFFFC 4294967292
2147483647 7FFFFFFF 80000000 2147483648
1 1 FFFFFFFE 4294967294
0 0 FFFFFFFF 4294967295
Вы, кажется, дважды переворачиваете биты, но отбрасываете результаты с первого раза: map(lambda x: x ^ 0xffffffff, a)
возвращает список, содержащий перевернутые значения, которые вы никому не назначаете. Если вы изменили эту строку, чтобы присвоить результат обратно a
вам не нужно bit_flip
больше (который также переворачивает биты, просто с помощью другого метода):
t = raw_input("")
a = map(int, t.split())
a = map(lambda x: x ^ 0xffffffff, a)
for i in a:
print i
Или даже короче
for i in map(lambda x: int(x) ^ 0xffffffff, raw_input("").split()):
print i
Список, возвращенный map(lambda x: x ^ 0xffffffff, a)
это ответ, но вы не используете его.
По крайней мере, в нем есть целые числа с перевернутыми битами, я не уверен, почему ожидаемый вывод имеет на один элемент меньше, чем вход.