c - 从 unsigned char (Little endian) 中检索正或负 n 位

标签 c bit-manipulation

我如何从 unsigned char 中检索负值。

假设我有一个 unsigned char,我将其传递给了 fun 并且只想获得第一个 6 位。现在,这些 6 位可以具有从其他函数填充的正值或负值。我想提取相同的值。 我可以使用 0x3F 成功提取正值。但是如果它有负值例子呢

signed char my_6bitfunc(  unsigned char *val )
{
   unsigned char temp = *val & 0x3F;
   return temp;
}

// somewhere in main
 int main()
{
    signed char valneg = -31 ;
    signed char valpos = 31 ;

   signed char a = my_6bitfunc( &valneg );
    signed char b = my_6bitfunc( &valpos );

    printf("  val neg %d\n", a );  // not -31 but 33 ?
    printf(" val positive %d\n", b );
}

o/p
a 的期望值 = -31 实际值 = 33 为什么?错了
b 的预期值 = 31 实际值 = 31 正确。

最佳答案

要对二进制补码字段进行符号扩展,请使用 ((x ^ N) - N) -- 其中 N 是符号位的数字表示,例如, 16 位为 32768。

signed char my_6bitfunc (unsigned char *val)
{
   unsigned char temp = *val & 0x3FU;
   return ((signed char )(temp ^ 0x20U)) - 0x20;
}

关于c - 从 unsigned char (Little endian) 中检索正或负 n 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46159277/

相关文章:

c++ - (b&(1<<i)) VS ((b >> i) & 1) C++

C 预处理器宏参数末尾有空格用于连接?

c - 表达式 "BIO *client = (BIO *)arg"是什么意思?

c - 恢复定义和宏

java - 切换文字位大小

c# - 将所有低位设置为 0,直到剩下两个 1(对于存储为字节数组的数字)

c - C 中的 "dynamic bitfield"

c++ - 如何根据用户请求安全地停止正在运行的线程?

c - 如何检查 free(node) 是否有效

c++ - 当第二个操作数为 1 时,如何将每一位清零?