15

少し哲学的な質問だと思います。

ORC 言語には、 、ANDXOR、、 などのビット演算の標準セットがSHIFT LEFT/RIGHTありNOTます。左回転/右回転の演算子または関数が言語に含まれていないのはなぜですか?

これらの演算子は、他のビット単位の演算子と同じ複雑さであり、通常、他の演算子と同様に単一のアセンブリ命令を必要とします。その上、私は回転演算子の多くの用途を考えることができます。おそらく、たとえばxor演算子よりも少なくないでしょう。そのため、それらが他のものと一緒に C に含まれていないのは少し奇妙に思えます。

C または C++ でローテーションする必要がある場合は、ベスト プラクティスに関する別の FAQ の質問があります。それについての議論は、この質問のトピックではありません。

4

2 に答える 2

6

これは、キャリーがある場合とない場合の2種類のローテーションがあるためだと思います。これにより、結果として得られるマシンのCARRYフラグ(1または0)に応じてローテーションが異なる方法で実行されます。これは、合計4つの演算子を実装することを意味し、@ Aniketが示しているようにローテーションを簡単に実装できる場合は、言語が不必要に複雑になります。

編集

それにもかかわらず、シフトは署名付きおよび署名なしで行われる場合もあります。実際、Javascriptには両方の演算子AFAIKがあります。ただし、Cは符号付き変数と符号なし変数をサポートしているため、コンパイラは符号付き変数と符号なし変数のどちらをシフトするかを認識している必要があるため、符号付きシフトを実行する意味はないと思います。符号付き/符号なしシフトは算術計算に役立ち、Cコンパイラはそれらを使用してアセンブリコードを生成する場合があります。たとえば、2の累乗で乗算または除算するなどの多くの算術演算は、コンパイラによってシフト演算に変換されます。Cにシフト演算子がある唯一の理由は、ビットマスクを操作するためです。

于 2012-10-27T10:57:06.567 に答える
1

C には、バイナリの左回転と右回転がありません。回転左および回転右関数を自分でコーディングできます。しかし、基準によると:いいえ。

シンプルな左回転:

int rotate_left(int num, int bits)
{
  return ((num << bits) | (num >> (32 -bits)));
} 

int rotate_right(int num, int bits)
{
  return ((num >> bits) | (num << (32 -bits)));
}

上記の関数は 32 ビット整数のみで動作します :)

ここで、哲学について説明します。C は、可能な限り移植可能であることを意図していました。それが、標準化チームが「移植可能なアセンブラ」にしたいと考えていることです。rol と ror が将来のアーキテクチャに存在するという保証はありません。または、異なる動作をする可能性があります。したがって、それは標準から遠ざけられました。

于 2012-10-27T10:47:32.067 に答える