Работа с битами.
- Войдите на сайт для отправки комментариев
Ср, 31/10/2012 - 14:48
Коллеги!
Есть переменная типа uint16_t. Необходимо с битами этой переменной проводить операции: установить в 0, установить в 1, инвертировать.
В качестве параметра получаю номер бита и собственно переменную.
Установить в 1 - я понимаю. Сделать битовую маску возведением 2 в степень i и выполнить битовое ИЛИ.
Вопросы:
1. можно ли инвертировать битовую маску? Например из 00010000 получить 11101111.
2. Как красиво инвертировать i-й бит?
Не гуру в С.
Подскажите пожалуйста.
bitRead()
bitWrite()
bitSet()
bitClear()
Ну и так чуть чуть на примере:
int i = 5; // бинерно: 101
i |= (1<<2); // Or -> 111 или i |= _BV(2);
i &= ~(1<<1); // And -> 110 или i &= ~_BV(1);
Спасибо огромное! То что нужно!
А вот от последних двух строчек аж волосы на спине дыбом встали! Где бы почитать про синтаксис?
p.s. Еще раз спасибо!
Читать теорию по с. Любой учебник, битовые операции.
| - или (OR)
& - и (AND)
~ - инверсия (NOT)
^ - исключающее или (XOR)
<< - сдвиг влево
>> - сдвиг вправо
тоглить к-тый бит
i^=1<<k;
подскажите пожалуйста. не могу сообразить как реализовать.
есть переменная типа int принимает значения от 1 до 252 (цвет оттенка (всего 252 оттенков)
далее 255/3 получаем 84. весь смысл в том, что три основных цвета будут задаваться уровнем от 1 до 84
в итоге мне нужно из одной переменной типа int (от 1 до 252)
получить три переменные (от 1 до 64)
я понимаю, что это можно сделать с помощью операций с битами но что то не соображу как.
я понимаю, что это можно сделать с помощью операций с битами но что то не соображу как.
84 не является степенью двойки. Так что битами не получится. Далее, если бы на каждый цвет было бы по 84 градации яркости, то и цветов было бы 84^3=592704
А раз у вас всего оттенков 252, то больше чем по 2-3 бита на цвет не получается. Например:
А вот их можно обрабатывать структурой
я что то совсем ничего не понял (((. что такое структуры не могу осилить.
вы бы не могли пример кода сделать. точнее например функцию. я ей отдаю значение от 1 до 255 а на выходе получаю три значения для трех цветов. от 1 до 255/3 (примерно 84) я потом просто умножку его на три перед записью в порт?
я ей отдаю значение от 1 до 255 а на выходе получаю три значения для трех цветов. от 1 до 255/3 (примерно 84) я потом просто умножку его на три перед записью в порт?
Это невозможно, так неправильно считаете! Тогда уже не делить на три надо, а кубический корень извлекать!
Я же привел выше пример восьмибитного RGB-332. А какая у Вас цветовая модель (RGB, CMY, YUV, YCbCr, RYB и т.п.) и как она кодируется я вообще без понятия.
Глупец! Не делить, а извлекать корень!!!!! Млин!
84 оттенка синего * 84 оттенка красного * 84 оттенка зеленого = 592704 различных цвета, ити его мать!!!
в байт укладывается, иля, по 6 оттенков, 6*6*6 = 216. И еще несколько цветов бонусом.
------------------
ЗЫ:опять школьники-дебилы набежали, спасу от них нет.
ЗЗЫ: ptr, Это, конечно, не Вам!
Цветовая модель RGB.
Цветовая модель RGB.
Для RGB-332 я Вам структуру дал выше. Через нее и можно работать с отдельными цветами. В зависимости от того, как удобней, или через union, или через указатель.
Но у меня есть большие сомнения, что у Вас она. Число 252 наводит на мысль, что у Вас вариация на тему палитры Netscape. 6x7x6=252. В этом случае через биты не поработаете. К тому же в Netscape эта таблица начиналась с 4, а не с нуля. То есть, допустимыми оттенками были от 4 до 255, а не от 0 до 251
если, как полагает ptr, палитра RGB 6x7x6, то
Andry Smart, а откуда родом эта переменная ваша? Какая функция/библа её генерит? Может удобнее будет исходный код подправить, что-б давал по стандарту -3 байта.
значит я так и сделал. храню три переменные и изменяю их. хотя для моих задач такое количество оттенков избыточно.
а вот http://www.getchip.net/posts/118-adjusty_led-podstraivaemyjj-rgb-svetodiod/ например реализовано то, что мне хотелось. на вход АЦП подаем напряжение и меняется цвет. в первой табличке наглядно описано то, что я хотел. правда тут диапазон от 32 до 224.
Andry Smart, вообще интресная тема. По картинке палитры RGB из ссылки выше я попытался примитивными средствами создать алгоритм.
Работает. Но есть подозрение что можно сделать всё проще и оптимальнее, но не хватает мозгов что-б найти формулу и уйти от IF 'фов..
по моему мне именно это и нужно. огромное спасибо.
Andry Smart, вообще интресная тема. По картинке палитры RGB из ссылки выше я попытался примитивными средствами создать алгоритм.
Работает. Но есть подозрение что можно сделать всё проще и оптимальнее, но не хватает мозгов что-б найти формулу и уйти от IF 'фов..
Я немного избыточно расписал как (скопируйте код куда-нибудь, чтобы вошёл по длине):
Это симуляция вывода по моей программе:
Промоделировано в Proteus 7.7 SP2.
короче в моем случае клавишей регулируется яркость в режиме свет (3й режим) но уменьшив ее до конца она опять становится максимум (так и задумано) но перестает дальше регулироваться.
а настройку цвета в 3м режиме я убрал, а то она была очень кривая