私はJPEGデコーダを実装しています。あるステップで、与えられたビット数(positive if 1th bit = 1)
から値の符号を判断する必要があります。 1番目のビットが0
の場合、この値から2の補数を得て、結果に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;
}
ありがとうございます!
それは末尾のゼロを追加します。 –
あなたはこれを読むことをお勧めします:http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true – martinkunev
(2の補数で、-1はパターン '1111111 ... 111'であるので、-1 << 3は、11111 ... 111000'です。 –