任务和代码(一):
/*用位运算将十进制数扩大一倍*/
#include <stdio.h>
int main()
{
unsigned short int n = 3;
int i;
for(i=0; i<20; i++)
{
printf("%d\n",n);
n<<=1; //n=n<<1;
}
return 0;
}
运行结果:
任务与代码(二):
/*用位运算实现“走马灯”功能*/
#include <stdio.h>
#include <windows.h> //包含sleep()的头文件
void show(int m);
int main()
{
unsigned int x = 0x1, y = 0x10; //0x表示十六进制,0表八进制,没有则默认十进制
while(1)
{
show(x);
x = (x << 2) | (x >> (30)); //左循环移位。单纯的移位运算,当移动到最高位时,其余位均为0
show(y);
y = (y << 2) | (y >> (30));
Sleep(500); //执行挂起一段时间
system("cls");
}
return 0;
}
void show(int m)
{
int i;
for (i=0; i<32; ++i) //根据无符号整型占4个字节,32位
{
/*十进制向二进制转换*/
if (m%2==0) //从低位开始输出
printf("○");
else
printf("●");
m/=2;
}
printf("\n");
}
运行结果:
任务和代码(三)
/*实现十六进制数的循环移位*/
#include <stdio.h>
#define ROTATE_LEFT(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))
#define ROTATE_RIGHT(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))
int main()
{
unsigned int a;
scanf("%x", &a);
printf("%08x\n", a);
/*4位二进制为1位十六进制,所以十六进制移动1位,二进制需要移动4位*/
/*sizeof()的返回值是类型的字节数*/
printf("%08x\n", ROTATE_LEFT(a, 8 * sizeof(int), 4)); //十六进制数左移一位
printf("%08x\n", ROTATE_RIGHT(a, 8 * sizeof(int), 8)); //十六进制数右移两位
return 0;
}
运行结果:
知识点总结:
1)参与位运算时,所有进制的数均是转换成二进制进行的
2)由第一段代码的运行结果知,使用左移位运算,左移一位,对应的十进制数×2
49152=2^15+2^14 此时第一个"1"已移到最高位;下一步32768=2^15表示只有最高位上是"1";
此后所有为上均为0。
心得:
通过“走马灯”的程序,进一步理解到32为十六进制,低十六位将十六进制转为二进制一一赋值,高十六位均为0.