august 发表于 2007-9-16 17:02:31

位移的问题

#include<stdio.h>
void main()
{
    unsigned int i,bits,c;
    scanf("%x",&i);
    bits=i>>(16-4);
    c=i<<4;
    c=c|bits;
    printf("i=%x \nc=%x\n",i,c);
}
这是将一个整数循环左移4位的运算,
输入fe13
i=fe13;
c=e13f;
在VC++中怎么才可以实现相同的效果呢?

john_he 发表于 2007-9-16 18:33:43

可以用下面的宏实现


#define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
#define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)


把这两行复制到文件开头就可以当函数使用
ROL(x, y)    =>    返回把32位整数x循环左移y位的结果
ROR(x,y)    =>    同上,右移

august 发表于 2007-9-16 19:13:37

真有够复杂的, UL是什么东东

john_he 发表于 2007-9-16 19:36:43

UL = unsigned long,写在整数后面表示把该整数当作unsigned long类型处理。

其实也不一定要用上面的实现,只要用好移位和位屏蔽(与操作)要实现循环移位不难,只是上面那个比较通用而已……

coolpay64 发表于 2007-9-16 21:39:08

其實只要把int 寫明確為 short int 便可以了
页: [1]
查看完整版本: 位移的问题