2016-09-02 3 views
2

JPEG 디코더를 구현 중이고 한 단계에서 주어진 비트 수인 (positive if 1th bit = 1)에서 값의 부호를 결정해야합니다. 1 번째 비트가 0 일 때이 값에서 2의 보수를 얻어야하고 결과에 1을 더 추가해야합니다.비트 조작

I했습니다이 일을 할 수있는 다음과 같은 기능을 가지고 :

#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을 후행 추가합니다. –

+0

당신은 이것을 읽을 수 있습니다 : http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true – martinkunev

+0

더 적은에 0을 더합니다 마스크의 유효 비트는 2의 보수로, -1은 패턴 '1111111 ... 111'입니다. 따라서 -1 << 3은 11111 ... 111000입니다. –

답변

4

같음 후에는 최 우측 (최하위 대체 제로와) 사람 :

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

F 's는 플랫폼의'sizeof int' 값에 달려 있습니다 ... –

+0

제 문제는'-1'을'0xFFFFFFFF'로 해석하지 못했습니다. 감사합니다! – Samashki95

+0

@ Samashki95 : 당신은 환영합니다. 위의 내 의견을 기억해주십시오. (대부분의 경우'-1 '은 실제로 8'''로 이루어집니다.) –

1

왼쪽 피연산자 값 (-1)이 오른쪽 피연산자 (nBits)에서 지정한 비트 수만큼 왼쪽으로 이동한다는 점이 (-1 << (nBits))입니다. 진수 표현으로 표현 x<<y 예를 들어, 2 Y 회 곱한 X 같음 :

X = 2, Y = 3 x<<y는 X 16