2016-09-02 18 views
2

私は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; 
} 

ありがとうございます!

+0

それは末尾のゼロを追加します。 –

+0

あなたはこれを読むことをお勧めします:http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true – martinkunev

+0

(2の補数で、-1はパターン '1111111 ... 111'であるので、-1 << 3は、11111 ... 111000'です。 –

答えて

4

に等しく後にそれが最も右(最下位置き換えゼロで)もの:

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

'Fあなたのプラットフォームの 'sizeof int'の値に依存します。 –

+0

私の問題は、' -1'を '0xFFFFFFFF'と解釈しなかったことです。ありがとう! – Samashki95

+0

@ Samashki95:あなたは歓迎です。上記の私のコメントを覚えておいてください(ほとんどの場合、 '-1'は確かに '' 8''''で作られています)。 –

1

(-1 << (nBits))とは、左側のオペランドの値(-1)が右側のオペランド(nBits)で指定されたビット数だけ左に移動することです。 10進表現で表現x<<yは、例えば、2 Y回掛けるXに等しい:

X = 2、Y = 3で、x<<yはX 16