2011-08-16 10 views
1

インクリメント(Cでは++)を使用し、ビット単位のシフト(Cでは<<)を使用して数値から1を減算するために使用できるアルゴリズムはありますか?ビット単位のシフトとインクリメントで減算を実装する

編集:私はあなただけ++オペレータでそれを行うことができますunsigned char型に事前

+0

確かに適切にインスタンス化された 'unsigned char result [1 << CHAR_BIT] [1 << CHAR_BIT]'を使ってそれを探します。 '++'や '<<'の必要はありません! – user786653

+2

なぜこれをやりたいですか? – nmichaels

答えて

4

感謝を使用しています。 UCHAR_MAX繰り返しのループ。しかし、非常に非効率的な:

unsigned char c = 42; 
unsigned char i = 0; 

while (++i) 
{ 
    ++c; 
} 
// c is now equal to 41 

LIVE DEMO

+5

これは同時にひどく正確です。 – nmichaels

+2

私はなぜ匿名のダウン投票を得たのだろうか? –

+0

この場合、コンパイラはそれを最適化するだけです - 非効率的で混乱しないでください –

3

はい。 n mod 255originalNumber - 1に等しくなるように番号nに接近する必要があります。最も簡単な方法は、あなたの番号に255を加えることです。これは、++演算子の255個以上のアプリケーションによって、または加算が必要になるまでシフトすることによって、よりインテリジェントに実行できます。要求されるように

編集:

unsigned char c = 77; 
unsigned char i = 0; 


if(c < 128) 
{ 
    i = c; 
    c = c << 1; 
} 
while(++i) 
{ 
    ++c; 
} 
// c == 76 

私は、これは<「演算子」を必要としますが、コンピュータは、それができる未満シフトすることができれば、正直に言うことができます実現しています。さもなければ、この最適化は不可能です。このこともまた最大1回シフトすることを覚えておいてください。これは、3-127の範囲の数値についてはまだ良くないです。それ以上シフトするためには、カウンタiのために普通の古い+演算子が必要です。しかし...私は追加できないコンピュータは知らない。

+0

シフトを使用して追加を実装するにはどうすればよいですか? –

+0

@Paul Rその2倍になります。それはショートカットです。あなたの番号が128より小さい場合は、少なくとも1回シフトしてから反復的に追加することができます。 –

+0

私はまだそれを*追加*にどのように翻訳するのか見ていないのですか? *乗算*はい、しかし*加算*(定数による)は可能ではないようですか? (また、おそらく 'n mod 256'を意味し、' n mod 255'を意味しないと思います) –

0

これは+も使用しているため、Paul Rの答えほど素晴らしいとは言えません。

unsigned char subtract_one(unsigned char value) 
{ 
    unsigned char addend= 0; 

    unsigned char old_addend; 

    do 
    { 
     old_addend= addend; 
     addend= addend << 1; 
     addend++; 
    } 
    while (old_addend!=addend); // stops when addend==-1; 

    return value + addend; 
} 
0

あなたにもビット演算子を使用して追加を実施し、「+」演算子を必要としない解決策を得るために、他の2つのソリューションであることを配合することができます:ちょうど

function add(int a, int b) { 
    int x, y; 
    do { 
     x = a & b; 
     y = a^b; 
     a = x << 1; 
     b = y; 
    } while (a); 
    return b; 
} 
関連する問題