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

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

У меня есть структура, скажем, 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

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

 Alpha.b = Alpha.a ^ 1; 

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

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

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

Чего вы хотите ! , а не ~ .

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

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

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

 Alpha.b = 1 - Alpha.a; 

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

 Alpha.b = !Alpha.a 

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

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

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

 Alpha.b = !(Alpha.a) 

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

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

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

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

 b = 0x01u & ( ~a ); 

или даже

 b = a ^ 0x01u; 

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

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

ура