我正在尝试将日期存储在一个无符号整型变量中,我需要以这种方式存储日期:
- 年份的第 11 位到第 0 位(从 0 到 4095)
- 月份的第 15 到 12 位(好像它们是从 0 到 3 的位,所以我可以存储从 0 到 11 的值)
- 当天 (0-31) 的第 20 到 16 位
存储年份不是问题,因为我这样做了:
unsigned int year=0;
year=year|2016
但是我不知道我应该输入月份和日期。假设第 12 位的值为 1,第 13 位的值为 2 等,我如何在 12 到 15 的位中放入一个像 10 这样的数字。
我应该使用哪种策略?
最佳答案
在 C 中,您可以使用 a >> b
双向移位位或 a << b
其中 a 是类次数,b 是类次数。插入的位将为 0。
在你的情况下,它会是
unsigned int time=0;
time |= year;
time |= month << 12;
time |= day << 16;
要解压它,你只需移动 time
在另一个方向和&
它到想要的位数:
int year = time & 0b111111111111;
int month = (time >> 12) & 0b1111;
int day = (time >> 16) & 0b11111;
编辑
如果你希望数据从最高位开始排序并堆叠到位
例如:
11111111111111111111100000000000
\___________|___|___/
year month day
你只需要相应地移动数据
包:
short int_length = sizeof(unsigned int); //usually 32
unsigned int time=0;
time |= year << (int_length - 12);
time |= month << (int_length - 16);
time |= day << (int_length - 21);
解压:
short int_length = sizeof(unsigned int); //usually 32
int year = (time >> (int_length - 12)) & 0b111111111111;
int month = (time >> (int_length - 16)) & 0b1111;
int day = (time >> (int_length - 21)) & 0b11111;
如果希望数据从最高位开始排序,向最低位堆叠
例如:
00000000000111111111111111111111
\___________|___|___/
year month day
改用这个
包:
unsigned int time=0;
time |= year << 9;
time |= month << 5;
time |= day;
解压:
int year = (time >> 9) & 0b111111111111;
int month = (time >> 5) & 0b1111;
int day = time & 0b11111;
关于c - 通过位操作将数据存储在变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35565962/