我正在尝试解决一个C语言编程问题,即使用移位操作将日期编码为2个字节,然后解码为日期、月份和年份。虽然我也可以使用按位&
和|
操作,但我只想使用移位操作。
问题在于:即使一切看起来都是正确的,日期和月份的输出对双位移位操作没有影响。年份是可以的,因为只有一个操作。这意味着双位移位操作不知何故没有按要求运行。
我用过unsigned char
,所以最后一个符号位肯定不是问题。Showbits
函数只是用来显示位。我在Windows 10中使用的是带有VSCode的gcc g++编译器。
// Date encoding in 2-byte number
#include <stdio.h>
#include <conio.h>
typedef unsigned int uint;
Showbits(int n)
{
int i, k, mask;
for (i = 15; i >= 0; i--)
{
mask = 1 << i;
k = n & mask;
k == 0 ? printf("0") : printf("1");
}
}
int main()
{
uint encd_date, date, month, year;
year = 2022;
month = 9;
date = 15;
encd_date = 512 * (year - 1980) + 32 * month + date;
printf("\nEncoded date:%u\n", encd_date);
printf("\nencd_date: ");
Showbits(encd_date);
year = (1980 + (encd_date >> 9));
month = (encd_date << 7);
month = (month >> 12);
date = (encd_date << 11);
date = (date >> 11);
printf("\ndate: ");
Showbits(date);
printf("\nmonth: ");
Showbits(month);
printf("\nyear: ");
Showbits(year);
printf("\nDecoded date %u month %u year %u", date, month, year);
return 0;
}
2条答案
按热度按时间vwkv1x7d1#
我按照Fe2O3的建议更改了适合16位的数据类型,它按预期工作。
yxyvkwin2#
似乎左移位的执行被拖回到右移位操作中。
一个桥接“修复”是使用一个中间变量,似乎“清除”的问题。这似乎是工作(周围)无论什么原因。
EDIT回到这里... OP试图使用
<<
(与>>
)来清除高位。这里有一个替代方案,它不将位左移到遗忘状态。相反,3个小值被放入一个无符号的16位缓冲区,然后使用shift和+/-
(实际上类似于位掩码)再次提取。以及
Showbits()
的替代版本(用于16位值)输出量