インクリメント(Cでは++
)を使用し、ビット単位のシフト(Cでは<<
)を使用して数値から1を減算するために使用できるアルゴリズムはありますか?ビット単位のシフトとインクリメントで減算を実装する
編集:私はあなただけ++
オペレータでそれを行うことができますunsigned char型に事前
インクリメント(Cでは++
)を使用し、ビット単位のシフト(Cでは<<
)を使用して数値から1を減算するために使用できるアルゴリズムはありますか?ビット単位のシフトとインクリメントで減算を実装する
編集:私はあなただけ++
オペレータでそれを行うことができますunsigned char型に事前
はい。 n mod 255
がoriginalNumber - 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のために普通の古い+演算子が必要です。しかし...私は追加できないコンピュータは知らない。
シフトを使用して追加を実装するにはどうすればよいですか? –
@Paul Rその2倍になります。それはショートカットです。あなたの番号が128より小さい場合は、少なくとも1回シフトしてから反復的に追加することができます。 –
私はまだそれを*追加*にどのように翻訳するのか見ていないのですか? *乗算*はい、しかし*加算*(定数による)は可能ではないようですか? (また、おそらく 'n mod 256'を意味し、' n mod 255'を意味しないと思います) –
これは+
も使用しているため、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;
}
あなたにもビット演算子を使用して追加を実施し、「+」演算子を必要としない解決策を得るために、他の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;
}
確かに適切にインスタンス化された 'unsigned char result [1 << CHAR_BIT] [1 << CHAR_BIT]'を使ってそれを探します。 '++'や '<<'の必要はありません! – user786653
なぜこれをやりたいですか? – nmichaels