Подтвердить что ты не робот

Как использовать инверсию в C

[как использовать оператор ~]

У меня есть структура Alpha. Я знаю значение элемента внутри Alpha (скажем a), которое может быть 0 или 1 - я хочу, чтобы другой элемент той же структуры принимал обратное значение Alpha.a. Например:

if Alpha.a = 1
then Alpha.b = 0

и наоборот

Я пробовал:

Alpha.b = ~ (Alpha.a)

Но, к сожалению, он не работает - когда Alpha.a равен 1, Alpha.b устанавливается в 254

Любые идеи?

Спасибо и приветствую,

SamPrat

4b9b3361

Ответ 1

Использовать оператор XOR:

Alpha.b = Alpha.a ^ 1;

Ответ 2

В C, true представляется равным 1 и false на 0. Однако при сравнении любое неверное значение обрабатывается как true.

Оператор ! выполняет логическую инверсию, поэтому! 0 равно 1 и! 1 равно 0.

Оператор ~, однако, выполняет побитовую инверсию, где каждый бит в значении заменяется на обратный. Итак, ~ 0 равно 0xffffffff (-1). ~ 1 равно 0xfffffffe (-2). (И как -1, так и -2 считаются истинными, что, вероятно, вас сбивает с толку.)

Вы хотите ! вместо ~.

Ответ 3

Оператор ~ отрицает каждый отдельный бит. Например, предположим, что Alpha.a является unsigned char. Тогда ~1 будет читать в двоичном формате как, ~ 00000001, и результатом будет 11111110 (опять же, в двоичном формате), что совпадает с 254 в десятичной и 0xFE в шестнадцатеричном формате.

Как и другие, используйте !Alpha.a или Alpha.a ^ 1.

Ответ 4

Хорошее кросс-платформенное кросс-языковое решение этой общей проблемы:

Alpha.b = 1 - Alpha.a;

Ответ 5

Вы хотите использовать другого оператора. В частности!

Alpha.b = !Alpha.a

Так как значения равны нулю или единице, это намного проще.

Ответ 6

Вы не можете использовать ~, поскольку это превратит 00000000 в 11111111, а не 00000001, как я думаю, вы ожидаете.

Если у вас есть bools, вы можете использовать:

Alpha.b = !(Alpha.a)

но если нет, вам, возможно, придется использовать логику if/else:

if (Alpha.a == 0)
{
    Alpha.b = 1;
}
else
{
    Alpha.b = 0;
}

Ответ 7

Как насчет постоперационной битовой маски?

используя символы без знака, которые ищут бит0:

b = 0x01u & ( ~a );

или даже

b = a ^ 0x01u;

или для "Boolean-Thinkers" (если вы знаете, что TRUE и FALSE могут отличаться от 0/1!, если вы хотите, чтобы это было "real boolean", вы должны использовать TRUE и FALSE, если они определены.)

b = (1 != a)?(0u):(1u);

Приветствия