Что означает (x ^ 0x1)! = 0?

Я наткнулся на следующий фрагмент кода

if( 0 != ( x ^ 0x1 ) )
encode( x, m );

Что значит x ^ 0x1 имею в виду? Это какая-то стандартная техника?

184

Решение

Операция XOR (x ^ 0x1) инвертирует бит 0. Таким образом, выражение фактически означает: если бит 0 в x равен 0 или любой другой бит в x равен 1, то выражение является истинным.

И наоборот, выражение ложно, если x == 1.

Итак, тест такой же как:

if (x != 1)

и поэтому (возможно) излишне запутывается.

278

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

  • ^ побитовый XOR операция
  • 0x1 является 1 в шестнадцатеричной записи
  • x ^ 0x1 будет инвертировать последний бит x (обратитесь к таблице истинности XOR по ссылке выше, если вам это не ясно).

Итак, состояние (0 != ( x ^ 0x1 )) будет правдой, если x больше 1 или если последний бит x равно 0. Что оставляет только x == 1 в качестве значения, при котором условие будет ложным. Так что это эквивалентно

if (x != 1)

P. S. Адский способ реализовать такое простое условие, я мог бы добавить. Не делай этого. И если вы должны написать сложный код, Оставить комментарий. Прошу тебя.

78

Это может показаться упрощенным объяснением, но если кто-то хотел бы пройти через это медленно, оно ниже:

^ это побитовый XOR оператор в c, c ++ и c #.

Побитовый XOR принимает две битовые комбинации одинаковой длины и выполняет
логическая исключающая операция ИЛИ на каждой паре соответствующих битов.

Исключающее ИЛИ — логическая операция, которая выводит истину всякий раз, когда оба
входы различаются (один верный, другой ложный).

таблица правды из XOR B:

a           b        a xor b
----------------------------
1           1           0
1           0           1
0           1           1
0           0           0

Итак, давайте проиллюстрируем 0 == ( x ^ 0x1 ) выражение на двоичном уровне:

             what? xxxxxxxx (8 bits)
xor 00000001 (hex 0x1 or 0x01, decimal 1)
gives 00000000
---------------------------
the only answer is 00000001

так:

   0 == ( x ^ 0x1 )    =>    x == 1
0 != ( x ^ 0x1 )    =>    x != 1
49

Это эксклюзивный оператор ИЛИ (XOR). Чтобы понять, как это работает, вы можете запустить этот простой код

    std::cout << "0x0 ^ 0x0 = " << ( 0x0 ^ 0x0 ) << std::endl;
std::cout << "0x0 ^ 0x1 = " << ( 0x0 ^ 0x1 ) << std::endl;
std::cout << "0x1 ^ 0x0 = " << ( 0x1 ^ 0x0 ) << std::endl;
std::cout << "0x1 ^ 0x1 = " << ( 0x1 ^ 0x1 ) << std::endl;

Выход будет

0x0 ^ 0x0 = 0
0x0 ^ 0x1 = 1
0x1 ^ 0x0 = 1
0x1 ^ 0x1 = 0

Так что это выражение

0 != ( x ^ 0x1 )

будет равен true только тогда, когда x! = 0x1.

Это не меняет сам х. Он только проверяет, равен ли х 0 или 1. это выражение может быть изменено на

if ( x != 0x1 )
34

Это проверяет, что x на самом деле не 0x1xorИНГ x с 0x1 приведет к 0, только если x является 0x1 … это старый трюк, в основном используемый на ассемблере

19

^ Оператор побитовый xor. А также 0x1 это число 1, записанный в виде шестнадцатеричной константы.

Так, x ^ 0x1 оценивает новое значение, которое совпадает с x, но с наименьшим значащим битом.

Код не более чем сравнивает x с 1 очень запутанным и неясным способом.

18

Оператор xor (исключающий или) чаще всего используется для инвертирования одного или нескольких битов.
Операция состоит в том, чтобы спросить, является ли один из битов одним, это приводит к следующей таблице истинности (A и B — входные данные, Y — выходные данные):

A    B    Y
0    0    0
0    1    1
1    0    1
1    1    0

Теперь цель этого кода, кажется, состоит в том, чтобы проверить, является ли последний бит равным 1, а остальные равны 0, это равно if ( x != 1 ),
Причиной этого неясного метода может быть то, что ранее использовались методы манипулирования битами и, возможно, они используются в других местах программы.

11

^ побитовый xor operator в c, В вашем случае x имеет значение x, например, 1. x имеет значение 10, то 10d ^ 1d ===> 1010b ^ 0001b = 1011b, 1011b == 11d таким образом, условие становится истинным.

8
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector