重複の可能性: Cビットごとの左回転関数
で回転シフトを実行する方法
C/C++ には<<
、>>
それぞれ左シフトと右シフトがあります。
この演算子の機能をテストするには、数値の最初のセット ビットを見つけ、n
左に 1 シフトして|
から、以前に見つけた最初のビットでシフトされた数値の を実行します。
どうすればいいですか?
重複の可能性: Cビットごとの左回転関数
で回転シフトを実行する方法
C/C++ には<<
、>>
それぞれ左シフトと右シフトがあります。
この演算子の機能をテストするには、数値の最初のセット ビットを見つけ、n
左に 1 シフトして|
から、以前に見つけた最初のビットでシフトされた数値の を実行します。
どうすればいいですか?
long long int shiftleft(long long int number, unsigned n)
{unsigned minusone=sizeof(long long int)*8-1;
long long int r= number & (1LL<<minusone);//save the sign, which is the most significant bit
long long int mask = (1LL<<minusone)-1; //a mask to get all other bits
return ( number<<n) | ((number & mask) >>(minusone-n)) | r; //rotate left in a loop only 63 bits
}
コードをテストしていない
次のように左に回転できます。
int n; // amount to rotate by
unsigned int d; // the positive number to rotate.
if(n < (CHAR_BIT * sizeof(int)))
int x = (n << d)|(n >> ((CHAR_BIT * sizeof(int)) - d));
ただし、これは正の数でのみ機能します。右回転は次のように実行できます。
if(n < (CHAR_BIT * sizeof(int)))
int x = (n >> d)|(n << ((CHAR_BIT * sizeof(int)) - d));
これも正の数でのみ機能します。