Двоичный в десятичный с использованием побитовых операторов
Я пытаюсь преобразовать некоторые двоичные данные в десятичные числа. Мне удалось преобразовать двоичное число в шестнадцатеричное, но теперь я хочу сделать то же самое с двоичным числом в десятичное. Я хочу использовать побитовые операторы и массив NO.
Посмотрите мой код из двоичного в шестнадцатеричный. Входящие данные 8 бит. Этот код сначала вычисляет наиболее значимое число, а затем наименее значимое число. Это работает хорошо, но я не могу понять, как bin dec
Функция console_print_char
является чем-то вроде функции printf моей программы.
void console_print_hex_char(unsigned char data){
unsigned char temp;
if(data){
temp = (data >> 4);
if(temp){
if(temp> 9) console_print_char(temp + ('A'- 10));
else console_print_char(temp + '0');
}
temp = data & 0x0F;
if(temp> 9) console_print_char(temp + ('A'- 10));
else console_print_char(temp + '0');
}
else{
console_print_char('0');
}
}
@Killerpirate, 👍0
Обсуждение2 ответа
Вы не можете делать то, что пытаетесь сделать. Прямого соответствия между некоторым количеством битов и десятичной цифрой нет.
В шестнадцатеричном формате каждые 4 бита соответствуют ровно 1 шестнадцатеричной цифре. Вот почему для компьютеров используется шестнадцатеричный формат.
Одна шестнадцатеричная цифра соответствует ровно 4 битам. Каждый раз, когда вы добавляете еще одну шестнадцатеричную цифру, вы добавляете 4 бита.
Две шестнадцатеричные цифры соответствуют ровно одному байту. От 00h до FFh представляет значение от 0 до 255.
Такого прямого соответствия между двоичным и десятичным числом нет. Если у вас есть 4 бита, для его представления требуется 1 или 2 десятичных цифры (0-15) Если у вас есть 8 бит, для его представления требуется 1, 2 или 3 десятичных цифры, но есть 3-значные десятичные значения (значения > 255), которые вы не можете представить с помощью 8 бит.
Binary Hex Decimal
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 A 10
1011 B 11
1100 C 12
1101 D 13
1110 E 14
1111 F 15
Вы просто не можете преобразовать двоичное число в десятичное с помощью побитового сдвига и маскирования.
Как говорит @Kwasmich в своем ответе, самое близкое, что вы, вероятно, сделаете, это преобразовать двоичное значение в BCD (двоично-десятичное число), где каждые 4 бита содержат десятичную цифру. Вы можете преобразовать THAT в вывод десятичных символов, используя маскирование и сдвиг.
вот код C++
vector<int> b={1,0,1,0,1,0,1};
int sum=0;
for(int i=b.size()-1, j=0; i>=0; i--, j++){
sum+=b[j]*(1<<i);
}
return sum;
Это способ преобразовать серию битов в десятичную. Обратите внимание, что он использует умножение и массивы, которых OP хочет избежать., @Duncan C
Кстати, глупо использовать b[j] * (1<<i). Это ненужное умножение. Просто используйте
sum += b[j]<<i. Если
b[j] равно 0, для этого бита ничего не сдвигается. Если
b[j]` равен 1 биту, он сдвигает единицу на соответствующую величину без необходимости умножения., @Duncan C
- Возможно ли двунаправленное UART-соединение по одному проводу передачи данных?
- Самый прямой способ назначить байты Serial.read() массиву?
- Проблема последовательной связи RS-485 с arduino
- Несогласованный цифровой вывод на простом коде
- Как точно получить значения потенциометра через USB-порт?
- Эквивалент UCSR0B для ESP2866
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Ошибка "'Serial' does not name a type"
ваш вопрос является общим вопросом программирования, который не связан с Arduino... пожалуйста, удалите свой пост и перейдите сюда https://stackoverflow.com/questions, @jsotola
примечание: у вас есть бродячий }, который находится за пределами «кодовой области» вашего сообщения, @jsotola
@jsotola прав, вам может понадобиться перенести это на SO. В любом случае, преобразование двоичного числа в десятичное проще всего сделать с помощью модуля (
%
) и деления (/
), если вы не хотите использовать библиотечные функции. Кроме того, существует алгоритм, который включает побитовое смещение и некоторое условное добавление 3. К сожалению, у меня нет под рукой URL-адреса., @the busybeeДвоичный пишется как ДВОИЧНЫЙ. Это би-на-ри, а не бин-эир-и., @Duncan C
Вы можете преобразовать Google Binary в BCD. Есть довольно короткие алгоритмы, которые делают это. После преобразования каждая десятичная цифра сохраняется в полубайте., @Kwasmich