2016-11-22 3 views
1

У меня проблема с созданной функцией в C++, которая вернет мне двоичное число.DEC to BIN using for и

function(unsigned short int user_input, int tab[16]) { 
for(ii = 0; ??; ii++) 
tab[ii] = i % 2; 
i = i/2; 
} 

Пользователь вводит номер DEC и возвращает БИН.

Должен ли я просто набрать ii < 16? Он работает, но это правильно?

+0

Возможно, вы хотите гарантировать только 16-битное значение, создав user_input типа 'uint16_t'. Это будет более переносимым и избежать ситуации, когда компилятор/архитектура задает значение unsigned short, чтобы не было 16 бит. См. Http://stackoverflow.com/questions/15505828/what-is-the-short-data-type-in-c – Chimera

+0

он должен выглядеть так, как я писал. например, если i type 5 i get 00000000 00000101 –

+1

Да, ваш код работает. Я не предлагаю, чтобы этого не случилось. Я предполагаю, что, чтобы избежать различий в реализации компилятора, вы можете указать свой user_input как 'uint16_t', а не считать, что' unsigned short int' всегда будет 16 бит. – Chimera

ответ

1

Это будет работать, но немного расточительно (если вы введете 1, вы разделите 0 на 2 15 раз). Также разделение на 2 может быть «ускорено» путем переключения. Вот альтернатива:

function(unsigned short int user_input, int tab[16]) { 
    int idx = 0; 
    while(user_input > 0) 
    { 
     tab[idx] = user_input & 1; 
     user_input = user_input >> 1; 
     idx++; 
    } 
    for(; idx < 16; idx++) 
    { 
     tab[idx] = 0; 
    } 
} 
+4

Я могу почти, но не совсем, гарантировать вам, что эти деления становятся смещениями. Но, пока вы на нем, вы также должны избавиться от этого мода. Если вы хотите выполнить бит twiddling, используйте '&' вместо этого (что также я уверен, что компилятор сделает). Смешивание 2, как это выглядит очень плохо. –

+0

Да, я видел, как работает здесь и на других сайтах, но моя функция должна быть включена. –

+0

Попросите компилятор сгенерировать сборку, чтобы точно знать. – Chimera

0

Несколько более компактная версия:

void function(uint16_t x, int b[16]) { 
    for (int i = 0; i != 16; ++i, x >>= 1) 
     b[i] = x & 1; 
} 

Обратите внимание, что это ставит значащий бит в b[0].

Чтобы ответить на ваш вопрос: Да, ii < 16 верен. Это заставляет цикл повторяться 16 раз, при этом ii переходит от 0 к 15 при каждом выполнении тела цикла, в течение которого вы проверяете последний бит, а затем сдвигаете.