Двоичный в десятичный с использованием побитовых операторов

Я пытаюсь преобразовать некоторые двоичные данные в десятичные числа. Мне удалось преобразовать двоичное число в шестнадцатеричное, но теперь я хочу сделать то же самое с двоичным числом в десятичное. Я хочу использовать побитовые операторы и массив 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');
    }
}

, 👍0

Обсуждение

ваш вопрос является общим вопросом программирования, который не связан с Arduino... пожалуйста, удалите свой пост и перейдите сюда https://stackoverflow.com/questions, @jsotola

примечание: у вас есть бродячий }, который находится за пределами «кодовой области» вашего сообщения, @jsotola

@jsotola прав, вам может понадобиться перенести это на SO. В любом случае, преобразование двоичного числа в десятичное проще всего сделать с помощью модуля (%) и деления (/), если вы не хотите использовать библиотечные функции. Кроме того, существует алгоритм, который включает побитовое смещение и некоторое условное добавление 3. К сожалению, у меня нет под рукой URL-адреса., @the busybee

Двоичный пишется как ДВОИЧНЫЙ. Это би-на-ри, а не бин-эир-и., @Duncan C

Вы можете преобразовать Google Binary в BCD. Есть довольно короткие алгоритмы, которые делают это. После преобразования каждая десятичная цифра сохраняется в полубайте., @Kwasmich


2 ответа


1

Вы не можете делать то, что пытаетесь сделать. Прямого соответствия между некоторым количеством битов и десятичной цифрой нет.

В шестнадцатеричном формате каждые 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 в вывод десятичных символов, используя маскирование и сдвиг.

,

0

вот код 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