将int8解释为两个int4

时间:2017-07-03 12:57:42

标签: c++ pointers types casting

我有一个指针(签名)int8_t

$("select#newObject_XX__dropDownName option:selected").text();

它来自netcdf文件,其中数据被编码为int8数组。为了限制文件大小并尽可能使用最便宜的表示,它实际上是一系列不同大小(4,8,16和32位)的有符号整数,其组织在其他地方指定,与该问题无关。

如果我想将数据解释为int16或int32,我可以这样做(在StoryTeller评论在这种情况下使用reinterpret_cast的未定义行为后更新):

int8_t *data

但是,如果要将数据解释为int4(单个int8内存空间中的两个int4),我该如何检索int4值? C中不存在int4类型。

我的问题简而言之:Ho将int8变量解释为两个int4

我想这个主题可能有用,但我真的不明白: https://codereview.stackexchange.com/questions/30593/split-a-long-integer-into-eight-4-bit-values

2 个答案:

答案 0 :(得分:3)

屏蔽掉两个4位整数,如果它们已经签名,你需要小心,不要签名。

对于无符号整数,您可以执行以下操作:

uint8_t original = 0xab;  // Source 8 bit data
uint8_t low = original & 0x0f // Mask off the high bits and leave just the low bits
uint8_t high = original >>4; // Move the high bits to the low bits

如果你有4位有符号整数,你需要将它们一直向左移动,然后再将它们向右移动以保持符号状态

int8_t original = 0xef; // Source 8 bit data -2 (high)and -1 (low)
int8_t low = original << 4;  // Move left 4 bits first
low = low >> 4;  // Move bits right but maintain sign
int8_t high = original >> 4; // Move right 4 bits

希望这会有所帮助

答案 1 :(得分:2)

这样做的一种方法是使用移位和掩码,如下所示:

unsigned high4bits = int8 >> 4; // shift high 4 bits into lower 4
unsigned low4bits = int8 & 0b00001111; // keep only low 4 bits

假设int8保存最初的两个4位整数并且类型为uint8_t,并且您需要2个无符号的4位整数。