可能重复:
如何在 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));
这也仅适用于正数。