web-dev-qa-db-ja.com

ビット単位シフト(左または右)とは何ですか?

私が見たさまざまなコードで演算子>>および<<を見てきました(実際には理解していません)が、実際に何をし、実際に何を使用しているか疑問に思っていますそのうちの。

[〜#〜] edit [〜#〜]

シフトがx * 2およびx / 2のようなものである場合、実際に*および/演算子を使用することとの本当の違いは何ですか?パフォーマンスに違いはありますか?

63
The.Anti.9

ここに applet があります。ここでは、シフトを含むいくつかのビット操作を実行できます。

ビットのコレクションがあり、それらのいくつかを境界を超えて移動します。

1111 1110 << 2 
1111 1000 

右から新しいゼロで埋められます。 :)

0001 1111 >> 3 
0000 0011 

左からいっぱい。特別な場合は、先頭の1です。言語とデータ型に応じて、多くの場合、負の値を示します。多くの場合、右にシフトしても最初のビットはそのままになります。

1100 1100 >> 1
1110 0110 

そして、それは複数のシフトにわたって保存されます:

1100 1100 >> 2
1111 0011

最初のビットを保存したくない場合は、トリプルサイン演算子を使用します(Java、Scala、C++、C afaikなど)。

1100 1100 >>> 1
0110 0110 

それは意味をなさないため、他の方向に同等のものはありません-多分あなたの非常に特別なコンテキストではありますが、一般的にはそうではありません。

数学的には、左シフトは* = 2、2つの左シフトは* = 4などです。右シフトは/ = 2などです。

47
user unknown

2の累乗で乗算する左ビットシフトおよび2の累乗で除算する右ビットシフト。たとえば、x = x * 2;x<<1と書くことも、x = x*8x<<3と書くこともできます(2の3の累乗は8であるため)。同様に、x = x / 2;x>>1などです。

35
Nitish

左方移動

x = x * 2^value(通常の操作)

x << value(ビット単位の操作)


x = x * 162^4と同じ)

同等の左シフトはx = x << 4になります

右シフト

x = x / 2^value(通常の算術演算)

x >> value(ビット単位の操作)


x = x / 82^3と同じ)

同等の右シフトはx = x >> 3になります

24
loyola

左シフト:シフトする必要がある値と、シフトするビット数の2の累乗の積に等しくなります。

例:

1<<3
0000 0001  ---> 1
Shift by 1 bit
0000 0010 ----> 2 which is equal to 1*2^1
Shift By 2 bits
0000 0100 ----> 4 which is equal to 1*2^2
Shift by 3 bits
0000 1000 ----> 8 which is equal to 1*2^3

右シフト:値の商に等しく、2をシフトするビット数の累乗でシフトする必要があります。

例:

8>>3
0000 1000  ---> 8 which is equal to 8/2^0
Shift by 1 bit
0000 0100 ----> 4 which is equal to 8/2^1
Shift By 2 bits
0000 0010 ----> 2 which is equal to 8/2^2
Shift by 3 bits
0000 0001 ----> 1 which is equal to 8/2^3
14
Raghu

ビットシフト演算子は、/または*演算子に比べて効率的です。コンピューターアーキテクチャでは、divide(/)またはMultiply(*)は複数の時間単位とレジスタを使用して結果を計算しますが、ビットシフト演算子は1つのレジスタと1つの時間単位の計算にすぎません。

3
Shobhit Raj

2の累乗で乗算する左ビットシフト。 2の累乗で除算するための右ビットシフト。

x = x << 5; // Left shift
y = y >> 5; // Right shift

C/C++では、次のように記述できます。

#include <math.h>

x = x * pow(2, 5);
y = y / pow(2, 5);
3
Pabitra Dash

いくつかの例:

  • たとえば、base64との間の変換を行うビット操作(8ではなく6ビット)
  • 2のべき乗の操作を行う(1 << 42^4に等しい、つまり16)
  • ビットを操作するときの読みやすいコードの作成。たとえば、1 << 4または1 << 5を使用して定数を定義すると読みやすくなります。
2
Aliostad

はい、パフォーマンスに関しては、ビット単位の左シフト操作と右シフト操作をo(1)の複雑なデータセットで実行できます。

たとえば、2のべき乗の計算^ n:-

int value = 1;
while (exponent<n)
    {
       //print out current power of 2
        value =value *2; // equivalent machine level left shift bit wise operation
        exponent++;
         }
    }

ビット単位の左シフト演算を使用した同様のコードは次のようになります。

value = 1 << n;

さらに、ビット単位の操作は、ユーザーレベルの数学的操作(マイクロコントローラーとプロセッサーで処理される最終的なマシンレベルの命令)の厳密なレプリカに似ています。

2
user4463890

以下に例を示します。

#include"stdio.h"
#include"conio.h"

void main()
{
    int rm,vivek;
    clrscr();
    printf("enter the any numbers\t(e.g)1,2,5");
    scanf("%d",&rm);//rm=5(0101)<<2(two step add zero's)so,value is 10100
    printf("this lift shitf value%d=%d",rm,rm<<4);
    printf("this right shitf value%d=%d",rm,rm>>2);
    getch();
}
0
R.M.VIVEK Arni