Notice
Recent Posts
Recent Comments
Today
Total
04-30 00:02
Archives
관리 메뉴

Jeongchul Kim

4. 비트 연산 -1 본문

Embedded Linux

4. 비트 연산 -1

김 정출 2015. 12. 22. 13:31

4. 비트 연산

특정 비트 제어

1. 비트 연산자

비트연산자에는 AND, OR, NOT, XOR의 기본연산자와 쉬프트 연산자로 이루어져있다. 이중 AND와 OR연산자는 논리연산자에서 사용하는 &&와 ||와 구분된다.


연산

연산자

해석

AND

&

이항

대응되는 비트를 AND 연산. 두 비트가 모두 1이면 1

OR

|

이항

대응되는 비트를 OR 연산. 두 비트가 모두 0이면 0

NOT

~

단항

비트 반전 1->0 0->1

XOR

^

이항

대응되는 비트를 XOR, 두 비트가 같으면 0, 다르면 1

SHIFT

<<

이항

지정된 횟수만큼 비트를 왼쪽으로 이동

SHIFT

>>

이항

지정된 횟수만큼 비트를 오른쪽으로 이동


2. 특정 비트 클리어, 설정, 반전

1. 비트 마스킹

0으로 클리어 하고 싶은 비트는 0과 & 연산한다. 이러한 원리를 비트 연산에 적용

** 레지스터를 0과 & 전체 연산하면 모든 비트가 0이 되므로 데이터를 손실하여 오 작동하게 되므로 유의한다.


2. 특정 비트 클리어

&, <<, ~ 이렇게 세 개의 비트 연산자를 이용해서 특정 비트 만을 클리어 시킬 수 있다.

메모리에 현재 들어있는 데이터가 얼마인지 알 수 없으므로 해당 비트가 0이던, 1이던 0으로 만들어야 한다. 0과 &를 시키면 이전 값이 무엇 인지에 상관없이 0이 된다.

예를 들어 5,3,2번 비트를 클리어 시키고자 한다면 5,3,2번 비트를 0과 &연산한다. 이때 모든 비트를 0과 &연산한다면 나머지 비트도 모두 0이 되므로 5,3,2번 비트만 수행해야 한다.


&연산 특징상 1과 연산하면 원래의 값이 된다. 즉 1&1=1이고 0&1=0이므로 1과 &시키면 원래의 값이 유지된다. 5,3,2번만 클리어되고 나머지 비트들은 원래의 값을 유지해야 하므로, 5,3,2번째 비트는 0과 나머지는 1과 &연산한다. 0으로 클리어 할 비트를 우선 1로 표현한 뒤 나중에 반전을 시킨다. 5,3,2번째 비트 이므로 (0x1>>5)+(0x3>>2) 로 표현할 수 있다. 이는 8비트 이진수로 표현한다면 00101100(2)이고 이것을 반전시키면 즉, ~(00101100) => 11010011이 되므로, 반전된 값을 &연산한다.


3. 특정 비트 설정

특정비트를 설정하는 방법도 클리어와 비슷하다. |연산의 특성은 1과 연산하면 1이되고, 0과 연산하면 원래의 값이 유지된다. 그래서 특정비트만 설정하려면 설정할 비트는 1과 나머지는 0과 |연산한다. |연산에 사용할 피연산자(B)를 만드는 방법은 1로 설정할 비트의 위치까지 1을 왼쪽쉬프트시키면 된다. 즉 그림과 같이 5,3,2번째 비트를 1로 설정하려면 (0x1<<5) + (0x1<<3) + (0x1<<2) 으로 피연산자를 만들 수 있다. 그런데 2,3번이 연속된 비트이므로 (0x3<<2)으로 바꿀 수 있다.


4. 특정 비트 클리어와 설정 수식

특정 비트 클리어 A &= ~((0x1<<5)+(0x3<<2));

특정 비트 설정 A |= (0x1<<5)+(0x3<<2);

** 특정 비트를 0으로 클리어 하려면 1을 이용해 원하는 위치까지 이동 시키고

반전 시켜 and 연산을 한다.

** 특정 비트를 1로 셋팅 하려면 원하는 위치까지 1을 이동하여 or 연산한다.


5. 전체 비트 반전

~ 연산자 사용하면 간단


6. 특정 비트 반전

^연산자(XOR, Exclusive OR)를 사용하면 된다.

특정비트만 반전시키기 위해서는 ^연산자를 사용해야 한다. ^연산은 두 개의 피연산자가 같으면 0으로 다르면 1로 설정된다. 그러므로 반전시키고자 하는 비트는 1과 ^연산하면 된다. 1^1=0이고 0^1=1이 되므로, 1과 XOR연산을 수행하면 원래의 값이 반전된다.



3. 특정 비트 검사, 추출

1. 특정 비트 검사

특정 비트가 0인지 1인지를 검사하는 방법이다. 예를 들어 5번째 비트가 0인지 1인지 검사할 경우에는 다음 수식을 이용할 수 있다. 결과가 0이면 5번째 비트는 0이고 결과가 1이면 5번째 비트는 1이다.

A & (0x1<<5)


2. 특정 비트 추출

특정 비트만 추출하는 방법이다.

예를 들어 [6:4]비트만 추출하고 싶다면 다음 수식을 이용할 수 있다.

(A>>4) & 0x7

8비트 중에서 4번째부터 3비트만 추출하는 것이다. 우선 [3:0]비트는 필요 없으므로 오른쪽으로 4번 쉬프트 시켜 잘라낸다. 그리고 111(2)과 &연산하면 필요한 3비트만 뽑아낼 수 있다.





Comments