位操作
Bit- manipulation
我正在实现一个 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))
是做什么的,它是如何工作的?
我知道作者有一条评论来解释它,但我也用下面的函数测试了它,它 returns 另一个结果。
const char *byte_to_binary(int x)
{
static char b[9];
b[0] = '[=11=]';
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 << (nBits))
所做的是将左操作数值 (-1) 向左移动右操作数 (nBits) 指定的位数。在十进制表示中,表达式 x<<y
等于 x 乘以 2 y 次,例如:
x=2,y=3 ,x<<y
x 等于 16.
它用零替换最右边(最不重要)的:
-1 << 0 == 0xFFFFFFFF
-1 << 1 == 0xFFFFFFFE
-1 << 2 == 0xFFFFFFFC
-1 << 3 == 0xFFFFFFF8
-1 << 4 == 0xFFFFFFF0
- ...
我正在实现一个 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))
是做什么的,它是如何工作的?
我知道作者有一条评论来解释它,但我也用下面的函数测试了它,它 returns 另一个结果。
const char *byte_to_binary(int x)
{
static char b[9];
b[0] = '[=11=]';
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 << (nBits))
所做的是将左操作数值 (-1) 向左移动右操作数 (nBits) 指定的位数。在十进制表示中,表达式 x<<y
等于 x 乘以 2 y 次,例如:
x=2,y=3 ,x<<y
x 等于 16.
它用零替换最右边(最不重要)的:
-1 << 0 == 0xFFFFFFFF
-1 << 1 == 0xFFFFFFFE
-1 << 2 == 0xFFFFFFFC
-1 << 3 == 0xFFFFFFF8
-1 << 4 == 0xFFFFFFF0
- ...