私は、私に戻って2進数を与えるC + +の関数に問題があります。DECとBINを使用してと
function(unsigned short int user_input, int tab[16]) {
for(ii = 0; ??; ii++)
tab[ii] = i % 2;
i = i/2;
}
ユーザーはDEC番号を挿入してBINに戻ります。
iiと入力するだけですか?それは働いていますが、それは正しいですか?
私は、私に戻って2進数を与えるC + +の関数に問題があります。DECとBINを使用してと
function(unsigned short int user_input, int tab[16]) {
for(ii = 0; ??; ii++)
tab[ii] = i % 2;
i = i/2;
}
ユーザーはDEC番号を挿入してBINに戻ります。
iiと入力するだけですか?それは働いていますが、それは正しいですか?
これはうまくいくかもしれませんが、少し時間がかかります(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;
}
}
私は、ほとんどの場合、それらの分割がシフトになることをあなたに保証することはできません。しかし、あなたがそれにいる間、あなたはそのmodを取り除くべきです。ちょっと変わったことをしたいのであれば、代わりに '&'を使ってください(コンパイラがやってくれると確信しています)。このような2のミキシングは本当に悪いです。 –
ええと...私はここや他のサイトで機能しているのを見ましたが、機能が必要です。 –
コンパイラで確実にアセンブリを生成してください。 – Chimera
もう少しコンパクト版:これはb[0]
で最下位ビットを置くこと
void function(uint16_t x, int b[16]) {
for (int i = 0; i != 16; ++i, x >>= 1)
b[i] = x & 1;
}
注ここでの代替です。
質問に答える:はい、ii < 16
が正しいです。これにより、ループが16回反復され、ii
は0
から15
になります。ループボディの実行ごとに最後のビットを確認してからshiftします。
user_inputを 'uint16_t'型にすることで、16ビットの値しか保証しないことがあります。これはより移植性が高く、コンパイラ/アーキテクチャが16ビットでないように符号なしのshortを指定する状況を回避します。 http://stackoverflow.com/questions/15505828/what-is-the-short-data-type-in-c – Chimera
私が書いたように見える必要がありますを参照してください。たとえば、5を入力した場合00000000 00000101 –
はい、あなたのコードが動作します。私はそれがないと示唆していません。コンパイラの実装の違いを避けるために、 'unsigned short int 'が常に16ビットであると仮定するのではなく、あなたのuser_inputを' uint16_t'に指定することをお勧めします。 – Chimera