我正在尝试编写一个旋转器功能,我正在尝试更多地澄清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);
}
谢谢!
答案 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)) );