Я наткнулся на следующий фрагмент кода
if( 0 != ( x ^ 0x1 ) )
encode( x, m );
Что значит x ^ 0x1
имею в виду? Это какая-то стандартная техника?
Операция XOR (x ^ 0x1
) инвертирует бит 0. Таким образом, выражение фактически означает: если бит 0 в x равен 0 или любой другой бит в x равен 1, то выражение является истинным.
И наоборот, выражение ложно, если x == 1.
Итак, тест такой же как:
if (x != 1)
и поэтому (возможно) излишне запутывается.
^
побитовый XOR операция0x1
является 1
в шестнадцатеричной записиx ^ 0x1
будет инвертировать последний бит x
(обратитесь к таблице истинности XOR по ссылке выше, если вам это не ясно).Итак, состояние (0 != ( x ^ 0x1 ))
будет правдой, если x
больше 1 или если последний бит x
равно 0. Что оставляет только x == 1 в качестве значения, при котором условие будет ложным. Так что это эквивалентно
if (x != 1)
P. S. Адский способ реализовать такое простое условие, я мог бы добавить. Не делай этого. И если вы должны написать сложный код, Оставить комментарий. Прошу тебя.
Это может показаться упрощенным объяснением, но если кто-то хотел бы пройти через это медленно, оно ниже:
^
это побитовый 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
Это эксклюзивный оператор ИЛИ (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 )
Это проверяет, что x
на самом деле не 0x1
… xor
ИНГ x
с 0x1
приведет к 0, только если x
является 0x1
… это старый трюк, в основном используемый на ассемблере
^
Оператор побитовый xor. А также 0x1
это число 1
, записанный в виде шестнадцатеричной константы.
Так, x ^ 0x1
оценивает новое значение, которое совпадает с x
, но с наименьшим значащим битом.
Код не более чем сравнивает x с 1 очень запутанным и неясным способом.
Оператор xor (исключающий или) чаще всего используется для инвертирования одного или нескольких битов.
Операция состоит в том, чтобы спросить, является ли один из битов одним, это приводит к следующей таблице истинности (A и B — входные данные, Y — выходные данные):
A B Y
0 0 0
0 1 1
1 0 1
1 1 0
Теперь цель этого кода, кажется, состоит в том, чтобы проверить, является ли последний бит равным 1, а остальные равны 0, это равно if ( x != 1 )
,
Причиной этого неясного метода может быть то, что ранее использовались методы манипулирования битами и, возможно, они используются в других местах программы.
^
побитовый xor operator
в c
, В вашем случае x имеет значение x, например, 1. x
имеет значение 10, то 10d ^ 1d ===> 1010b ^ 0001b = 1011b, 1011b == 11d
таким образом, условие становится истинным.