Двоичное отрицание в питоне - PullRequest
1 голос
/ 03 августа 2011

Я не могу найти логическое отрицание целых чисел как оператора где-либо в Python.

В настоящее время я использую это:

def not_(x):
    assert x in (0, 1)
    return abs(1-x)

Но я чувствую себя немного глупо. Нет ли для этого встроенного оператора? Логическое отрицание (not) возвращает логическое значение - это не совсем то, что я хочу. Есть ли другой оператор или способ заставить not вернуть целое число, или я застрял с этим хитрым обходным путем?

Ответы [ 8 ]

4 голосов
/ 03 августа 2011

Вы можете использовать:

int(not x)

для преобразования логического значения в 0 или 1.

3 голосов
/ 03 августа 2011

Вы имели в виду:

int(not(x))

?Предполагая, что любое ненулевое целочисленное значение истинно, а 0 ложно, в результате вы всегда получите целое число 0 или 1.

2 голосов
/ 03 августа 2011

Итак, что вы ожидаете получить 1, когда input равен 0, а 0 и input 1?Тогда XOR ваш друг, вам нужно XOR ваше значение с 1:

In [15]: negate = lambda x: x^1

In [16]: negate(0)
Out[16]: 1

In [17]: negate(1)
Out[17]: 0
2 голосов
/ 03 августа 2011

Если вы ищете Побитовое Нет, тогда ~ - это то, что вы ищете.Тем не менее, он работает в форме дополнения двух.

1 голос
/ 03 августа 2011

Это вызовет KeyError, если x не в (0,1)

def not_(x):
    return {1:0,0:1}[x]

Версия кортежа также примет -1, если вы не добавите проверку для нее, но, вероятно, быстрее

def not_(x):
    return (1,0)[x]

$ python -m timeit "(1,0)[0]"
10000000 loops, best of 3: 0.0629 usec per loop
$ python -m timeit "(1,0)[1]"
10000000 loops, best of 3: 0.0646 usec per loop

$ python -m timeit "1^1"
10000000 loops, best of 3: 0.063 usec per loop
$ python -m timeit "1^0"
10000000 loops, best of 3: 0.0638 usec per loop

$ python -m timeit "int(not(0))"
1000000 loops, best of 3: 0.354 usec per loop
$ python -m timeit "int(not(1))"
1000000 loops, best of 3: 0.354 usec per loop

$ python -m timeit "{1:0,0:1}[0]"
1000000 loops, best of 3: 0.446 usec per loop
$ python -m timeit "{1:0,0:1}[1]"
1000000 loops, best of 3: 0.443 usec per loop
0 голосов
/ 21 декабря 2016

Это легко сделать с помощью некоторых основных функций двоичного и строкового управления в Python

если x целое число, для которого мы хотим побитовое отрицание, которое называется x_bar (узнал в цифровом классе:))

>>> x_bar = x^int('1'*len(bin(x).split('b')[1]),2)
>>> bin(x_bar) #returns the binary string representation of integer 'x'

Функция bin (int_value) возвращает двоичное строковое представление любого целого числа, например: '0b11011011'

XOR выполняется с «1»

Счастливое кодирование ....

0 голосов
/ 03 августа 2011

Я думаю, что ваш подход очень хорош по двум причинам:

  1. Это быстро, ясно и понятно
  2. Проверка ошибок

Я предполагаю, что такой оператор не может быть определен в целых числах из-за следующей проблемы: что возвращать, если заданное значение не равно 0 или 1? Бросить исключение? Предположим, что положительные целые числа означают 1? Но отрицательные целые числа?

Ваш подход определяет конкретное поведение - принимайте только 0 или 1.

0 голосов
/ 03 августа 2011

Вы можете использовать not, но затем конвертировать результат в целое число.

int(False)
0
int(True)
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...