我正在跟随《C程序设计语言》(K&R)学习。这是练习2-8。它要求创建一个函数,将数字向右旋转一定数量的位。
我想出来的答案“似乎”可以完成任务,并且只用了两行代码。然而,我在网上查找其他方法时发现这个Stack Overflow答案讲述了逐位移动每个位。如果我像下面的代码一样批量移动,会有什么问题吗?我有什么遗漏的地方吗?
#include <stdio.h>
/* Rotate number 'num' to the right by 'rbits' bits */
int RotRight(unsigned int num, int rbits) {
unsigned int mask = num << ((sizeof(int)*8)-rbits);
return (num>>rbits)|mask;
}
为了容纳我从评论中学到的东西,这是上面代码的编辑版本。这看起来不错吗?
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int RotRight(int num, int rbits) {
if(num<0) {
fprintf(stderr, "Rotating negative numbers is undefined\n");
exit(EXIT_FAILURE);
}
if(rbits >= sizeof(int)*CHAR_BIT)
rbits = rbits % (sizeof(int)*CHAR_BIT);
if(rbits <= 0)
return num; // rbit range should be 0 to (bitwidth - 1)
unsigned int mask = num << ((sizeof(int)*CHAR_BIT)-rbits);
return (num>>rbits)|mask;
}