c - 使用位算术从二进制 int 获取绝对值

标签 c bit-manipulation mask absolute-value

flt32 flt32_abs (flt32 x) {
    int mask=x>>31;

    printMask(mask,32);
    puts("Original");
    printMask(x,32);

    x=x^mask;

    puts("after XOR"); 
    printMask(x,32);

    x=x-mask;

    puts("after x-mask");
    printMask(x,32);
    return x;
}

这是我的代码,对值 -32 调用函数将返回 0.125。我很困惑,因为这是一个非常直接的腹肌公式,但我似乎遗漏了一些东西。有任何想法吗?

最佳答案

flt32 是浮点类型还是 fixed point数字?

我怀疑这是一种定点算术类型,而您没有正确使用它。让我解释一下。

顾名思义,定点数使用固定的小数位;这意味着它使用固定位数的小数部分。事实上,它是一个按比例缩放的整数。

我猜您使用的 flt32 类型对整个部分使用最高有效 24 位,对小数部分使用最低有效 8 位; 32 位表示的实数值是相同的 32 位整数表示的值除以 256(即 28)。

例如,32 位数字 0x00000020 被解释为整数 32。作为小数部分使用 8 位的定点数,其值为 0.125 (=32/256)。

您发布的代码是正确的,但您没有正确使用它。

使用8十进制数字编码为定点数的数字-320xFFFFE000,它是-的整数表示8192(=-32*256)。该算法正确生成 8192,即 0x00002000 (=32*256);当它被解释为定点时,这也是32

如果将 -32 传递给函数,而没有注意将其编码为定点,它会正确地将其转换为 32 并返回该值。但当32 (0x00000020)被解释为0.125 (=1/8=32/256)时定点(我假设函数 printMask() 的作用)。

如何正确测试代码?

您可能有一个从整数创建定点数的函数。使用它来获取 -32 的正确表示形式,并将该值传递给 flt32_abs() 函数。

如果你没有这样的函数,编写它很容易。只需将整数乘以 256(或者更好,将其左移 8 位)即可:

function int_to_fx32(int x)
{
    return x << 8;
}

定点库通常使用宏进行此类转换,因为它们可以生成更快的代码。用宏来表示,如下所示:

#define int_to_fx32(x) ((x) << 8)

现在你进行测试:

fx32 negative = int_to_fx32(-32);
fx32 positive = fx32_abs(negative);
// This should print 32
printMask(positive, 32);

// This should print 8192
printf("%d", positive);
// This should print -8192
printf("%d", negative);

// This should print 0.125
printMask(32, 32);

关于c - 使用位算术从二进制 int 获取绝对值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35235400/

相关文章:

c - c语言复数的任意次幂

更改函数中整数的值

c++ - 检查标志是否设置在整数变量中

java - 如何在java中按位移动二进制字符串?

mysql - 有没有办法直接从 SELECT 查询中将 IP 与 IP+CIDR​​ 匹配?

c - 使用realloc获得的扩展内存包含哪些内容?

c++ - 使用变量列表参数时 va_list 的长度?

c++ - 将位从一个数组转换为另一个数组?

c# - 如何获取默认网络适配器的主机广播地址? C#

html - 屏蔽视频 SVG 形状