我只是想知道是否有办法将一个数字“移位”? 我用谷歌搜索了,我找不到任何与我想做的事情有关的事情。 假设我的号码为0b01001101,我想将它向右移动两次“就地”,附加任何从头到尾的数字。所以它看起来像0b01010011。 在c ++中是否有任何函数允许我像这样向左或向右移位?
答案 0 :(得分:1)
使用汇编指令ror并且每次都要获取进位标志的值。
int rotate(int x, int n)
{
for(int i = 0; i < n; i++) {
__asm {
ror x, 1 ; rotate and store limit bit in cf
lahf ; get part of flags in ah
and ah, 1 ; get only the cf
shl eax, 31 ; put it at the end
and x, eax ; and store in x
}
}
return x;
}
答案 1 :(得分:1)
自己写一个,我认为这并不难。
首先存储右边的两位,然后进行位移。最后用存储的位填充左边的两位。
答案 2 :(得分:1)
您想要实施rotational shift
这是一个模板化的版本,应该适用于所有类型的整数(包括短路,字符,整数和无符号/有符号)。
template<class T>
T rotate_shift_right(T x, int shift)
{
if ((shift > 0) && (shift < (sizeof(x)*8)))
{
x = ((unsigned)x >> shift) | (x << (sizeof(x) * 8 - shift));
}
return x;
}
template<class T>
T rotate_shift_left(T x, int shift)
{
if ((shift > 0) && (shift < (sizeof(x)*8)))
{
x = (x << shift) | (((unsigned)x) >> (sizeof(x) * 8 - shift));
}
return x;
}
答案 3 :(得分:0)
我认为转移它然后将最后一个字节放到开头应该有效。
答案 4 :(得分:0)
不,你应该创建自定义的
答案 5 :(得分:0)
这是作为特定于供应商的扩展实现的。对于MSVC,您可以使用_rotl8, _rotl16(或_rotr*
向右旋转)。不确定GCC,但您可以随时放入汇编并使用rol
或ror
。