Преобразование битового числа в байтовое значение (AVR Docs)

Мне трудно понять, что говорит мне этот документ: https://www.microchip.com/webdoc /AVRLibcReferenceManual/FAQ_1faq_use_bv.html

У меня есть макрос с именем _BV, который

преобразование битового числа (обычно в байтовом регистре) в байтовое значение

И пример говорит об этом

_BV(3) => 1 << 3 => 0x08

Я вроде как привык к битам, байтам и т. д. Но я не понимаю, что такое 3 в этом примере? Он говорит, что преобразует битовое число, но 3 не является двоичным, это целое число. И макрос преобразует его в 0x08, что соответствует десятичному значению 8.

Я очень запутался. Надеюсь, кто-нибудь объяснит мне, что здесь происходит!

, 👍1

Обсуждение

когда вы видите 0x08, не думайте "десятичное"... думайте "шестнадцатеричное" ..... шестнадцатеричные числа легко преобразуются в двоичные ..... например, 0x98 совпадает с 0b10011000, @jsotola


1 ответ


Лучший ответ:

3

Биты внутри байта нумеруются от 0 до 7 справа налево. крайний правый (наименее значащий) бит 0, следующий бит 1... и самый левый (самый значащий) бит 7.

Выражение _BV(3) создает байт, в котором бит 3 установлен (равен 1) и все остальные биты свободны (равны 0). В двоичном виде это выглядит так:

position:   7  6  5  4  3  2  1  0
bit value:  0  0  0  0  1  0  0  0

Макрос заменяется на 1<<3, который принимает целое число 1 (0b00000001 в двоичный) и сдвигает все свои биты на три позиции влево. результат может быть записан как 0b00001000 в двоичном формате, 0x08 в шестнадцатеричном и 8 в десятичном формате.

,

и имейте в виду @xetra11, что в этом случае шестнадцатеричное число и десятичное число совпадают только по совпадению. Если бы бит 4 был установлен в 1 вместо бита 3, это было бы 0x10 в шестнадцатеричном и 16 в десятичном! Может быть полезно учитывать, что все десятичные числа имеют «основание 10» (отсюда и слово DEC-imal). Но двоичные числа имеют основание «2», а шестнадцатеричные числа — это основание 16. Основание -1 — это наибольшее число, которое может быть в «цифре», прежде чем должен произойти перенос для представления числа. Для шестнадцатеричного, чтобы иметь 16 цифр, он идет от 0 до 9, за которым следует AF., @Randy