2016-08-16 3 views
0

나는이어떻게 부호

'W' = 57h = 0101_0111 
     ABh = 1010_1011 

처럼 홀수 비트 인덱스 사이에도 인덱스의 비트를 대체 C를, encode_char_in 위해 노력하고 char 때문에 C에있어 같은 C 함수 로그인 문자로 할 수있다 할 수있다 음수가되면, 비트 사이를 전환 할 수 없습니다 (signed char - 작동). 아래 코드에서 다른 값 을 받았습니다.

#include <stdio.h> 
#include <limits.h> 
#define TRUE 1 
#define ONE 1 

char codeBinPair(char str); 

void main() 
{ 
char str[2] = { 182,NULL }; 
unsigned char ch = 'W'; 
printf("ch = %x\n", ch); 
ch = codeBinPair(ch); 
printf("ch = %x\n", ch); 
ch = codeBinPair(ch); 
printf("ch = %x\n", ch); 
} 

char codeBinPair(char str) 
{ 
    int idx = 0; 
    char ch1 = str, ch2 = 0, mask = ONE; 
    while (TRUE) 
    { 
    mask <<= ONE; 
    mask &= ch1; 
    mask >>= ONE; 
    ch2 |= mask; 
    // Initialize the mask 
    mask = ONE; 
    mask <<= idx; 
    mask &= ch1; 
    mask <<= ONE; 
    ch2 |= mask; 
    // Index next loop we want to replace 
    idx += 2; 
    // If We Finish whole Byte 
    if (idx == CHAR_BIT) 
     return ch2; 
    // Initialize the mask 
    mask = ONE;  
    mask <<= idx; 
} 
} 
+1

C가'char'와'부호 char'을 체결했다, 당신은 알고있다. 비트 수학에 관심이 있다면 그 중 하나를 사용하십시오. (또는 더 나은 것은'int_least8_t'와'uint_least8_t'입니다.) – cHao

+0

@cHao 그가'unsigned char ch = 'W'를 선언했기 때문에 그는 알고있는 것 같습니다. 그래서 코드는'codeBinPair'에 대한 인자의 타입으로'unsigned char'을 사용해야합니다. – Barmar

+0

'void main()'은 유효하지 않은 서명이며 정의되지 않은 동작을 호출합니다. 그런 다음 자신의 boolen 상수/형식을 정의하지 말고 표준 형식을 사용하십시오! 마지막으로 코드에서 정의되지 않은 동작을 호출하거나 일부 시프트 및 특정 값에 대한 구현 정의 동작을 사용합니다. – Olaf

답변

0

변경 unsigned charcodeBinPair의 모든 char.

unsigned char codeBinPair(unsigned char str) 
{ 
    int idx = 0; 
    unsigned char ch1 = str, ch2 = 0, mask = ONE; 
    while (TRUE) 
     { 
      mask <<= ONE; 
      mask &= ch1; 
      mask >>= ONE; 
      ch2 |= mask; 
      // Initialize the mask 
      mask = ONE; 
      mask <<= idx; 
      mask &= ch1; 
      mask <<= ONE; 
      ch2 |= mask; 
      // Index next loop we want to replace 
      idx += 2; 
      // If we finish whole byte 
      if (idx == CHAR_BIT) 
       return ch2; 
      // Initialize the mask 
      mask = ONE;  
      mask <<= idx; 
     } 
} 
+0

제안 (ifx (idx) = CHAR_BIT) (또는 뭔가), 그렇지 않으면 홀수 한'CHAR_BIT '가 무한 루프로 연결됩니다. – chux

+0

나는이 코드 – user6719757

+0

을 만들려고 노력했지만 아직 작동하지 않는다 ... 나는 뭔가를 그리워한다. 아이디어는 짝수 비트와 홀수 비트를 분리하고 짝수 비트의 인덱스를 홀수 비트 (짝수 비트 대 짝수 비트)로 전환하는 것이었다) – user6719757

0
char codeBinPair(char str) 
{ 

    int idx = CHAR_BIT - 1; 
    char mask = 1; 
    char maskA = 0; 
    char maskB = 0; 
    // str = 'W' 
    while (idx--) // Loop 7 times = 7 bits in char 
    { 
     //To Replace the odd bits 
     maskA |= mask & str; 
     mask <<= 1; 
     //To Replace the even bits 
     maskB |= mask & str; 
     mask <<= 1; 
    } 
    // to shift ths bits of 2 masks 
    maskA <<= 1; 
    maskB >>= 1; 
    // Subtraction between the 2 masks will give the encoded 
    return maskA - maskB;} 

    } 
+0

이 답변을 유용하게 사용하려면 원래 코드의 문제점과이 버전의 수정 방법을 설명해야합니다. 코드 묶음을 그냥 버리면 독자가 이해하는 데 도움이되지 않습니다. – Barmar

+0

'unsigned char' 대신에'char'을 사용하고 있으므로, 서명을 할 수 있습니다. 그러면 비트 연산이 예상대로 작동하지 않을 수 있습니다. – Barmar

+0

나는 이해한다. ..... – user6719757