|
김재철 님이 쓰신 글 :
: 파일에서 데이터를 읽어서 한 바이트씩 비트연산을 하려고 합니다.
: 예를들어 0x13(0001 0011)값을 순서를 바꾸어 0xC8(1100 1000)로 바꾸는거죠
: 비트연산 개념이 없어 헤매고 있습니다.
: 소스코드 부탁드립니다.
안녕하세요 스페로 입니다..
//---------------------------------------------------------------------------
#include <stdio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
typedef union
{
unsigned char Data;
struct BIT { // Bit Field Structure
unsigned b0 : 1;
unsigned b1 : 1;
unsigned b2 : 1;
unsigned b3 : 1;
unsigned b4 : 1;
unsigned b5 : 1;
unsigned b6 : 1;
unsigned b7 : 1;
} bit;
}BIT_DATA_8;
void rotate_bit_data_8(BIT_DATA_8 * src);
int main(int argc, char* argv[])
{
BIT_DATA_8 src;
BIT_DATA_8 dest;
src.Data = 0x13;
rotate_bit_data_8(&src);
printf("0x%x",src.Data);
return 0;
}
//---------------------------------------------------------------------------
void rotate_bit_data_8(BIT_DATA_8 * src)
{
BIT_DATA_8 tmp;
tmp.bit.b0 = src->bit.b7;
tmp.bit.b1 = src->bit.b6;
tmp.bit.b2 = src->bit.b5;
tmp.bit.b3 = src->bit.b4;
tmp.bit.b4 = src->bit.b3;
tmp.bit.b5 = src->bit.b2;
tmp.bit.b6 = src->bit.b1;
tmp.bit.b7 = src->bit.b0;
src->Data = tmp.Data;
}
우선 위코드는 그냥 값만을 나타나게 하기 위해.
utime님이 제홈피에 올려 주신 bit필드 구조체와 union을 응용해서.
#if defined(WIN32)
#define ROTATE(a,n) _lrotl(a,n)
#else
#define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
#endif
이런식으로 비트는 ROTATE로 해도 될거라 생각 했지만 답이 안나오더라구요 ㅎ.ㅎ 이유는 ... bit연산을 해봐야..
그리고 _lrotl() , _lortr() 인자로 long 입니다.
결국 위 소스 처럼 bit 필드 구조체를 이용해서 억지로 뒤바꿔서 답을 얻게 했습니다.
ㅋㅋ
그럼 수고 하세요.
|