Работа с битами

IUS
Offline
Зарегистрирован: 15.01.2015

В принципе вопрос плёвый , не могу найти в справочниках реверс бита.

Подскажите плиз. есть такой  оператор? 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

^
a ^= 1 << 3;

IUS
Offline
Зарегистрирован: 15.01.2015

если я не ошибаюсь то это сдвиг, а мне нужен реверс бита , имеется битовая маска, необходимо выполнить реверс одного бита, не трогая остальные

JasKo
Offline
Зарегистрирован: 21.11.2015

Не ошибаешься и ошибаешься тоже. :) Это сокращенная запись операции.  В переменной а будет инвертироваться третий бит, лагодаря знакам ^= . А на счет сдвига ты прав 1 << 3   это 1 свигается в третий разряд.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

IUS, как вариант "без сдвига" :-)   a^=B00001000;

arduinec
Offline
Зарегистрирован: 01.09.2015
Datak
Offline
Зарегистрирован: 09.10.2014

ЕвгенийП,

if (n | MASK) - условие всегда == TRUE, и весь этот if оптимизируется до простого n &= ~MASK;
Похоже, AND занимает чуть меньше места, чем XOR. 

Приличные компиляторы, вообще-то, в таких случаях выдают предупреждение. :)

if (n & MASK) должно быть, конечно.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Одно не понимаю, зачем учить дрифту человека, впервые севшего за руль.
Пусть сначала поймёт как просто рулить, а потом будет дрифтовать.
Видно пора валить с форума, дабы не тратить время впустую.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Datak пишет:

if (n | MASK) - условие всегда == TRUE, 

if (n & MASK) должно быть, конечно.

Ой, блин, это я чёй-то ступил, сорри. Конечно же, Вы правы.

Сотру тот свой пост, чтобы случайно кто-то за "истину" не воспринял.

IUS
Offline
Зарегистрирован: 15.01.2015

Спасибо JacKo 

На данный момент более чем исчерпывающий ответ , я разобрался. сразу.

Решил вопрос немного по своему , но всё-же вот часть кода всего таких проверочек 24.

        if (StrContains(HTTP_req, "NF=10")) NF_Taim[0] = NF_Taim[0] ^ 1;
        if (StrContains(HTTP_req, "NF=11")) NF_Taim[0] = NF_Taim[0] ^ 2;
        if (StrContains(HTTP_req, "NF=12")) NF_Taim[0] = NF_Taim[0] ^ 4; 
        if (StrContains(HTTP_req, "NF=13")) NF_Taim[0] = NF_Taim[0] ^ 8; 

 

А на счет всего остольного, без практики всё равно не запомню.