c - 通过位操作将数据存储在变量中

标签 c bit-manipulation bitwise-operators bit-shift bit

我正在尝试将日期存储在一个无符号整型变量中,我需要以这种方式存储日期:

  • 年份的第 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/

相关文章:

java - 我应该在 Java 中进行位移除以 2 吗?

python - 使用按位运算而不是测试偶数/奇数

binary - 这个对二进制文件执行 BSL 的 Erlang 函数是如何工作的?

swift - swift 将 UInt32 拆分为 [UInt8]

java - 按位与运算符的使用

c - c中的指针运算和二维数组?

c - L1内存带宽: 50% drop in efficiency using addresses which differ by 4096+64 bytes

c程序不接受最多100000个输入

c - 转换指针 'actually' 在幕后做了什么?

javascript - 如何将标志写入 7 位数字