1

重複の可能性: Cビットごとの左回転関数
で回転シフトを実行する方法

C/C++ には<<>>それぞれ左シフトと右シフトがあります。

この演算子の機能をテストするには、数値の最初のセット ビットを見つけ、n左に 1 シフトして|から、以前に見つけた最初のビットでシフトされた数値の を実行します。

どうすればいいですか?

4

2 に答える 2

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 
}

コードをテストしていない

于 2012-08-13T21:00:55.713 に答える
0

次のように左に回転できます。

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));

これも正の数でのみ機能します。

于 2012-08-13T21:02:05.573 に答える