BIT 연산을 사용한 메모리 저장
날짜 저장을 위한 처리 Sequence
- 시간 구조체(SYSTEMTIME) 선언 : 년(4자리),월(2자리),일(2자리),시(2자리),분(2자리),초(2자리),밀리초(3자리) 를 저장할 수 있는 메모리 공간을 만든다.
- 현재의 시스템 시간 읽어오기 : 선언된 메모리에 현재 시간정보가 저장된다.
- 생성할 패킷 저장 메모리 초기화 : 인덱스는 임으로 정의한 것이어서 14이며, 시간정보를 어디에 저장할지 정하게 되면 인덱스 값은 변하게 된다.
- 읽어온 시스템 시간의 년도가 4바이트인데, 년도 4자리를 사용하지 않고 2자리만 사용한다면, 년도 - 2000을 하여 2자리만 사용할 수 있도록 한다.
사용 예제 코드
- SYSTEMTIME sysTime;
- GetLocalTime(&sysTime);
- bufHex[14] = 0;
- bufHex[14] = (sysTime.wYear - 2000) << 2;
- bufHex[14] |= (sysTime.wMonth & 0x0C) >> 2;
날짜를 특정 메모리에 비트 단위로 저장하는 코드 설명
해당 코드는 현재 시스템 시간에서 연도와 월 정보를 읽어와서, 이를 16진수로 변환하여 버퍼에 저장하는 코드입니다.
- (sysTime.wYear - 2000) << 2 : 시스템 시간의 연도에서 2000을 뺀 값을 2비트 왼쪽 시프트 연산자(<<)를 사용하여 4배로 만듭니다. 그 결과 연도 값이 4비트로 표현되어 버퍼의 14번 인덱스에 저장됩니다.
- (sysTime.wMonth & 0x0C) >> 2 : 시스템 시간의 월 정보를 4로 나눈 나머지를 버리고(& 0x0C) 2비트 오른쪽 시프트(>>) 연산자를 사용하여 2비트로 만듭니다. 그 결과 월 정보가 2비트로 표현되어 버퍼의 14번 인덱스에 저장된 값을 비트 논리합(|=) 연산자를 사용하여 월 정보를 추가로 저장합니다.
따라서, 이 코드는 시스템 시간에서 연도와 월 정보를 추출하여 16진수로 변환하여 버퍼에 저장하는 작업을 수행하는 코드입니다.
비트 연산의 주요 고려사항
비트 연산(bitwise operation)을 수행할 때는 몇 가지 고려사항이 있습니다.
- 데이터 타입 : 비트 연산을 수행하는 데에는 정수형 데이터 타입(int, long 등)을 주로 사용합니다. 그러나 부동소수점(float, double 등)은 비트 연산이 불가능합니다.
- 비트 연산자 종류 : 비트 연산자로는 AND(&), OR(|), XOR(^), NOT(~), 시프트 연산자(<<, >>)가 있습니다. 각 연산자의 동작을 잘 이해하고 사용해야 합니다.
- 연산 우선순위 : 비트 연산자는 산술 연산자보다 우선순위가 낮습니다. 따라서 괄호를 사용하여 우선순위를 조정해야 할 때가 있습니다.
- 비트 수 : 비트 연산을 수행할 때 비트 수(bit length)를 고려해야 합니다. 데이터 타입의 비트 수에 맞춰서 연산을 수행해야 합니다.
- 부호 여부 : 부호 있는 데이터 타입에서는 최상위 비트(MSB, Most Significant Bit)가 부호 비트(sign bit)로 사용됩니다. 이를 고려하여 연산을 수행해야 합니다.
- 이진수 변환 : 비트 연산은 이진수(bit)를 대상으로 수행됩니다. 따라서 이진수 변환을 잘 이해하고 수행할 수 있어야 합니다.
이러한 고려사항들을 잘 이해하고 비트 연산을 수행하면, 효율적인 코드 작성에 도움을 줄 수 있습니다.