实现对16位数的反转(倒序变换

一个算法
unsigned short SwapBit16(unsigned short Data)
{
	int i;
	unsigned short  Dest;

	Dest = 0;
	for(i=0;i<8;i++)
		Dest |= ((((Data&(1<<i))?1:0)<<(15-i)) + (((Data&(1<<(15-i)))?1:0)<<i));

	return Dest;

}

上面这个函数实现对16位数的反转(倒序变换)。
实现的思路,可以使用如下方法来测试一下。

这个是一个测试函数
#include <stdio.h>
int main(void )
{
	int i;
	unsigned short  Data=45918;

	int Dest = 0;
	for(i=0;i<8;i++){
		 printf("Date1 is 0x%x \n",(((Data&(1<<i))?1:0)<<(15-i)));
		 printf("Date2 is 0x%x \n",(((Data&(1<<(15-i)))?1:0)<<i));
		 printf("Date2 and Date1 is 0x%x \n",((((Data&(1<<i))?1:0)<<(15-i)))+(((Data&(1<<(15-i)))?1:0)<<i));
		Dest |= ((((Data&(1<<i))?1:0)<<(15-i)) + (((Data&(1<<(15-i)))?1:0)<<i));
	}
      	printf("the 0b1011001101011110 end the Date is 0x%x\n",Dest);
	return Dest;

}
下面是测试信息结果:
Date1 is 0x0 
Date2 is 0x1 
Date2 and Date1 is 0x1 
Date1 is 0x4000 
Date2 is 0x0 
Date2 and Date1 is 0x4000 
Date1 is 0x2000 
Date2 is 0x4 
Date2 and Date1 is 0x2004 
Date1 is 0x1000 
Date2 is 0x8 
Date2 and Date1 is 0x1008 
Date1 is 0x800 
Date2 is 0x0 
Date2 and Date1 is 0x800 
Date1 is 0x0 
Date2 is 0x0 
Date2 and Date1 is 0x0 
Date1 is 0x200 
Date2 is 0x40 
Date2 and Date1 is 0x240 
Date1 is 0x0 
Date2 is 0x80 
Date2 and Date1 is 0x80 
the 0b1011001101011110 end the Date is 0x7acd

从结果可看出,实现思想是15<-->0,14<-->1,13<-->2,......8<-->7相交换,具体怎么实现的,你自己可以深入分析一下。。

可以通过定时器中断来实现倒序的六位数秒表,具体步骤如下: 1.设置定时器的计数频率为1MHz,即每个计数周期为1us; 2.设置定时器的计数值为999999,即定时器计满的时间为999999us,即999.999ms; 3.初始化计数器为999999,即开始计时的初始值为999.999ms; 4.启动定时器,并开启定时器中断; 5.在定时器中断服务函数中,每次定时器计满时,将计数器减1,并将减1后的值通过数码管显示出来; 6.当计数器减到0时,停止计时,并结束定时器中断。 以下是具体的代码实现,以STC51单片机为例: ```c #include <reg51.h> // 数码管8段显示码数组 unsigned char code LED_Disp[10] = { 0xC0, // 0 0xF9, // 1 0xA4, // 2 0xB0, // 3 0x99, // 4 0x92, // 5 0x82, // 6 0xF8, // 7 0x80, // 8 0x90 // 9 }; // 定时器中断服务函数 void Timer0_ISR() interrupt 1 { static unsigned long count = 999999; // 计数器 unsigned char i; if(count == 0) { // 计时结束 TR0 = 0; // 停止定时器 return; } count--; // 计数器减1 for(i = 0; i < 6; i++) { // 显示6位数 P2 = LED_Disp[count % 10]; // 取个位数 count /= 10; // 继续取下一位数 P0 = 1 << i; // 选择显示 delay(1); // 延时1ms P0 = 0x00; // 关闭显示 } } void main() { TMOD = 0x01; // 设置定时器0为模式1 TH0 = 0xFC; // 定时器计数值为999999 TL0 = 0x18; ET0 = 1; // 允许定时器0中断 EA = 1; // 允许总中断 TR0 = 1; // 启动定时器0 while(1); // 等待定时器中断 } // 延时函数,单:1ms void delay(unsigned int ms) { unsigned char i, j; while(ms--) { i = 4; j = 200; do { while(--j); } while(--i); } } ``` 注:以上代码中,delay()函数是一个简单的延时函数,用来实现1ms的延时。由于STC51单片机的时钟频率为11.0592MHz,因此每个计数周期为1us的定时器中断服务函数执行时间应该控制在1ms以内,否则可能会出现计时不准的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值