exclusive OR
1과 0, 0과 1처럼 달라야지만 true가 되는 것.
bit 연산을 한다는 것은 자기 비트에 맞는 것들을 연산하는 것.
특정한 비트의 정보가 0인지 1인지 검사하는 것을 마스킹이라고 한다.
a ^ (0x1<<7)
비트 연산 사용 이유
비트 단위로 명령을 내려서 디바이스를 제어하게끔 되어있기 때문이다. 디바이스 관리자는 모두 C로 만들어진다. 새로운 디바이스를 꼽으면 디바이스의 레지스터와 호스트 컴퓨터의 메모리와 매핑이 된다.
인간 중심으로 프로그램을 짜면 비효율적인 코드가 나올 수밖에 없다.
매크로는 기계적인 변환이다. 매크로를 함수로 정의하는 것은 좋은 프로그래밍이다. 그러나 괄호로 싸주지 않으면 엉뚱한 결과를 초래할 수 있다.
패킹
32비트로 많은 정보를 저장할 수 있다. 예를 들어 6개의 비트를 사용하여 40명을 구분하고, 1개의 비트를 밀어서 성별을 저장하고, 5개의 비트를 밀어서 나이를 저장하는 것을 말한다. 그리고 마스킹을 사용하여 값을 가져올 수 있다.
enumeration
프로토콜을 지정한다. 하트는 1, 스페이드는 2 ... 이런 식으로. 그러나 이러면 보기 쉽지 않다. 따라서 HEART가 1임을 enum을 사용하여 강제로 배정한다면, HEART로 쓰면 1로 자동으로 대체된다.
배열은 속도 측면에서,
포인터는 메모리 측면에서 유리하다.
static char *but = "abc"
text = buf[choose];
switch case문이 아니라 포인터 함수 배열로 하자.
데이터 저장 방식은 RISK와 CISK 방식이 있다. 각각 빅 인디언과 리틀 인디언이라는 방식으로 데이터를 저장하는데, 따라서 덤프를 떠오면 다른 숫자가 나온다는 문제가 있었다. 이 문제를 union을 사용하여 해결한다.