位移的问题
#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++中怎么才可以实现相同的效果呢? 可以用下面的宏实现
#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) => 同上,右移 真有够复杂的, UL是什么东东 UL = unsigned long,写在整数后面表示把该整数当作unsigned long类型处理。
其实也不一定要用上面的实现,只要用好移位和位屏蔽(与操作)要实现循环移位不难,只是上面那个比较通用而已…… 其實只要把int 寫明確為 short int 便可以了
页:
[1]