Ответ 1
Использовать оператор XOR:
Alpha.b = Alpha.a ^ 1;
[как использовать оператор ~]
У меня есть структура 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
является 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!, если вы хотите, чтобы это было "real boolean", вы должны использовать TRUE и FALSE, если они определены.)
b = (1 != a)?(0u):(1u);
Приветствия