我有一个指针(签名)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
答案 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位整数。