私が見たさまざまなコードで演算子>>
および<<
を見てきました(実際には理解していません)が、実際に何をし、実際に何を使用しているか疑問に思っていますそのうちの。
[〜#〜] edit [〜#〜]
シフトがx * 2
およびx / 2
のようなものである場合、実際に*
および/
演算子を使用することとの本当の違いは何ですか?パフォーマンスに違いはありますか?
ここに 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などです。
2の累乗で乗算する左ビットシフトおよび2の累乗で除算する右ビットシフト。たとえば、x = x * 2;
はx<<1
と書くことも、x = x*8
をx<<3
と書くこともできます(2の3の累乗は8であるため)。同様に、x = x / 2;
はx>>1
などです。
x = x * 2^value
(通常の操作)
x << value
(ビット単位の操作)
x = x * 16
(2^4
と同じ)
同等の左シフトはx = x << 4
になります
x = x / 2^value
(通常の算術演算)
x >> value
(ビット単位の操作)
x = x / 8
(2^3
と同じ)
同等の右シフトはx = x >> 3
になります
左シフト:シフトする必要がある値と、シフトするビット数の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
ビットシフト演算子は、/または*演算子に比べて効率的です。コンピューターアーキテクチャでは、divide(/)またはMultiply(*)は複数の時間単位とレジスタを使用して結果を計算しますが、ビットシフト演算子は1つのレジスタと1つの時間単位の計算にすぎません。
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);
いくつかの例:
1 << 4
は2^4
に等しい、つまり16)1 << 4
または1 << 5
を使用して定数を定義すると読みやすくなります。はい、パフォーマンスに関しては、ビット単位の左シフト操作と右シフト操作を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;
さらに、ビット単位の操作は、ユーザーレベルの数学的操作(マイクロコントローラーとプロセッサーで処理される最終的なマシンレベルの命令)の厳密なレプリカに似ています。
以下に例を示します。
#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();
}