我正在实现JPEG解码器,并且第一步需要从给定数量的(positive if 1th bit = 1)位确定值的符号。
当第1位是0时,我必须从该值中获取二进制补码,然后加1到结果。

我具有以下功能来完成此工作:

#include <stdio.h>      /* printf */
#include <string.h>     /* strcat */
#include <stdlib.h>     /* strtol */

typedef int bool;
#define true 1
#define false 0

int DetermineSign(int val, int nBits)
{
    bool negative = val < (1<<(nBits-1));

    if (negative)
    {
        // (-1 << (s)), makes the last bit a 1, so we have 1000,0000 for example for 8 bits

        val = val + (-1 << (nBits)) + 1;
    }

    // Else its unsigned, just return
    return val;
}


谁能解释一下(-1 << (nBits))这个表达式的作用以及它的工作原理吗?
我知道作者有评论来解释它,但是我还使用以下功能对其进行了测试,它返回了另一个结果。

const char *byte_to_binary(int x)
{
    static char b[9];
    b[0] = '\0';

    int z;
    for (z = 128; z > 0; z >>= 1)
    {
        strcat(b, ((x & z) == z) ? "1" : "0");
    }

    return b;
}

int main(void)
{
    char testValue = 0;

    testValue = (-1 <<(testValue));

    printf("%s\n", byte_to_binary(testValue)); // output 1111 1111 doesn't it has to be 1000 000?

    return 0;
}


谢谢!

最佳答案

它将最右边(最低有效)的零替换为零:


-1 << 0 == 0xFFFFFFFF
-1 << 1 == 0xFFFFFFFE
-1 << 2 == 0xFFFFFFFC
-1 << 3 == 0xFFFFFFF8
-1 << 4 == 0xFFFFFFF0
...

关于c - 位操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39289026/

10-13 00:36