旋转位,使用sizeof运算符

时间:2010-01-19 23:43:19

标签: sizeof

我正在尝试编写一个旋转器功能,我正在尝试更多地澄清sizeof运算符。由于我不知道我需要旋转什么类型的数值对象,我假设我需要使用sizeof运算符

unsigned rotator(unsigned object, int count)

这个函数原型,其中object是要旋转的对象,count是要移动的位数。我想象如果我有一个8位数,我首先会确定要旋转的实际位数(例如,因为这个人可以使count = 20,所以我会做类似的事情:

int actualBitRotation;
if (count > sizeof(object)) {
    actualBitRotation = count % sizeof(object);

但我认为我还没有正确理解sizeof。我确实尝试过阅读有关它的在线资源,并从另一个问题得到了该委员会的一些帮助,但我认为我没有得到它。我知道sizeof返回对象中的字节数,因此我会包含并改为执行更像

的操作
int actualBitRotation;
if (count > (sizeof(object) * CHAR_BIT) {
    actualBitRotation = count % (sizeof(object) * CHAR_BIT);
}

谢谢!

2 个答案:

答案 0 :(得分:3)

sizeof()确实返回字节数,因此您需要乘以CHAR_BIT来获取位数。

template<typename T> T bitrot(T& t,size_t bits) {
   bits %= (sizeof(T)*CHAR_BIT);
   return ((t >> (sizeof(T)*CHAR_BIT)-bits) | (t << bits));
}

为了澄清,你应该总是避免将操作转移到变量中的位数之外;结果取决于处理器和编译器。

答案 1 :(得分:0)

怎么样:

union hack {
    int asSigned;
    unsigned asUnsigned;
};
hack top, bottom;
int realBitCount = count % (sizeof(T)*8);
top.asSigned = (realBitCount == 0) ? 0 : -(1 << (realBitCount-1));
bottom.asUnsigned = 0xFFFFFFFF ^ top.asUnsigned;

top.asUnsigned &= object;
bottom.asUnsigned &= object;
return static_cast<T>( (bottom.asUnsigned << realBitCount) | (top.asUnsigned >> (sizeof(T)-realBitCount)) );