2014-12-03 3 views
2

나는 이진 표현의 내 번호 마지막 4 개 개의 숫자를 추출하는 문제가가의 마지막 4 자리 추출 : 1111 1001 을 내가 가지고 처음 4 그러나 내가 가지고있는 문제가 마지막 네^하는 int의 이진 표현

# include <stdio.h> 
# include <stdlib.h> 
# define BYTETOBINARYPATTERN "%d%d%d%d%d%d%d%d\n" 
# define BYTETOBINARY(byte) \ 
(byte & 0x80 ? 1 : 0), \ 
(byte & 0x40 ? 1 : 0), \ 
(byte & 0x20 ? 1 : 0), \ 
(byte & 0x10 ? 1 : 0), \ 
(byte & 0x08 ? 1 : 0), \ 
(byte & 0x04 ? 1 : 0), \ 
(byte & 0x02 ? 1 : 0), \ 
(byte & 0x01 ? 1 : 0) 

int main() 
{ 
    int num = 505; 
    PRINTBIN (num); 

    // int result = num & bitwise; 
    //PRINTBIN(result); 
    // first num; 
    int i; 
    int bit=0x01; 
    int bitwise; 
    for (i =0;i<4;i++) 
    { 
     int bit1=bit<<i; 
     bitwise = bit1|bit; 

    } 
    printf("1:%d\n", bitwise); 
    PRINTBIN(bitwise); 

    //second num; 
    int bitwise1; 
    int b0 = 0; 
    int bit2; 
    for(i=0;i<4;i++) 
    { 
     bit2 = bit<<(4+i); 
     bitwise1 = bit2|b0;  
     PRINTBIN(bit2); 
    } 
    printf("2:%d\n",bitwise1); 
    PRINTBIN(bitwise1); 

    return 0; 

} 

답변

2

당신이 무슨 일을하는지보다 훨씬 쉬운 방법이있다 : num & 0x0f는 그냥 printf("%04b\n", num &0x0f); 이진에 인쇄, 마지막 네 얻을 것이다. 편집 : % b 지정자는 비표준입니다! 아마 그때 그것을 사용해서는 안되며, 대신에 아래의 예제를 사용하십시오./편집

모든 f의 16 진수는이 중첩으로 1111 인이 쿼텟을 쉽게 꺼낼 수 있습니다. printf를 사용할 수 없다면 한 번에 하나씩 마스킹 한 다음 숫자를 줄이면서 위로 이동하여 조금만 인쇄하면됩니다. 예를 들면 다음과 같습니다.

for(int i = 0; i < 4; i++) { 
    printf("%c", (number & 8) ? '1' : '0'); // print the number on the left of the quartet 
    number <<= 1; // shift it to the right by one position, putting the next bit in position to print next loop around 
} 

비트 조작의 다른 유용한 트릭은 마스크를 얻기 위해 주변을 이동하고 있습니다. 비트 #n을 얻으려면 오른쪽에서 시작하여 number & (1 << n)을 실행하십시오. 한 번 왼쪽으로 0 번 이동하면 마스크가 가장 중요한 (가장 오른쪽) 비트를 얻습니다. 한 번 왼쪽으로 한 번 시프트 한 것은 두 번째이고, 두 번째로 최하위 비트는 한 번입니다. 귀하의 bit1 = bit << i 라인이 이것을 수행하지만,이 속임수에 리터럴 1을 사용하는 것이 변수 일 필요는 없다는 것을 명확히하기 위해 선호합니다.

+0

우우, 나는 두 번째 네 가지로 생각하면, 더 나은 용어는 아마도 가장 중요하고 중요하지 않다. 가장 중요한 것은 맨 왼쪽에 쓰여졌을 때, 가장 큰 숫자를 나타내는 것이므로 '가장 중요하다'라고합니다. 어쨌든, 내가 할 수있는 방법은 숫자를 네 번 오른쪽으로 옮기는 것입니다 :'num >> = 4; '그런 다음 첫 번째 작업과 동일한 방식으로 프로세스를 반복하십시오. 그것을 뒤집어서 새로운 문제를 기존의 해결 된 문제로 바꾸어서 똑같은 일을 다시 할 수 있습니다. –

+0

이것은 아주 좋습니다. 고맙습니다. bitwise 조작을보다 쉽게 ​​할 수있는 새로운 기술을 배웠다. – SunnyTrinh

+0

'% b' 변환 지정자가 없다. 적어도 적어도 C 스펙이나 POSIX와 관련이있다. – dreamlax

2

4 자리 숫자 만 표시하려는 경우 이미 가능한 모든 표현을 알고 있으므로 룩업 테이블을 사용하십시오. 다른 위치에서 다른 4 자리 숫자를 표시하려면, 단지 num&0x0F 후 이동을하지만, 마스크는 다른 값 대신 0x0F

const char * bin[16] = { 
    "0000", 
    "0001", 
    "0010", 
    ...... 
    "1111" 
}; 

printf("%s\n", bin[num&0x0F]); 
0

num & 0xF이 자리의 마지막을 추출 할 수 있습니다.

마지막 4를 인쇄하려면 코드를 사용할 수 있습니다

printf("%04d", (num&8)*125 + (num&4)*25 + (num&2)*5 + (num&1)); 

또 다른 방법을 진수 사용 : 인쇄하려면
을 8 최하위, 코드를 사용할 수 있습니다

printf("%08lo", 
    (num&128)*16384LU + (num&64)*4096L + (num&32)*1024L + (num&16)*256 + 
    (num&8)*64 + (num&4)*16 + (num&2)*4 + (num&1)); 

이 방법은 작동 최대 21 비트까지 그리고 많은 용어 방정식 또는 for 루프를 사용하여 unsigned long long.

0
The following function extractAllBitsFromIntToArray 
Parameters: 
int value: the source integer to use for the extraction 
int* totalBits: pointer to callers' area to receive size of returned int array 
Returns: 
int* a pointer to a malloc'd array that contains the extracted bits from 'value' 
    least significant bit at offset 0 into the array. 
    note: the caller must 'free()' this array when done using it 


#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define TOTAL_BITS (sizeof(int)<<3) // assumes 8 bit bytes 
#define BIT_MASK(count) (1<<count) 

int * extractAllBitsFromIntToArray(int value, int* numBits) 
{ 
    int i = 0; // loop counter 
    int *pRetArray = NULL; 
    if(NULL == (pRetArray = malloc(TOTAL_BITS*sizeof(int)))) // array to return 
    { 
     perror("malloc failed"); 
     exit(EXIT_FAILURE); 
    } 

    memset(pRetArray, 0x00, TOTAL_BITS*sizeof(int)); // clear array 

    // extract bits, where pRetArray[0] is LSB 
    for(i=0; i<TOTAL_BITS; i++) 
    { 
     pRetArray[i] = (value&(BIT_MASK(i)))? 1: 
    } 

    return(pRetArray); 
} // end function: extractAllBitsFromIntToArray 
+1

1) 아마도'#define TOTAL_BITS (sizeof (int) * CHAR_BIT)'라고 가정하고 가정이 필요하지 않습니까?2) '부호없는 값'과 'BIT_MASK (count) (1u << count)'를 제안하여 'int'부호 비트로의 이동을 피하십시오. 3)'(value & (BIT_MASK (i)))의 끝에 무언가를 놓치셨습니까? 1 :'? – chux