만져보는 임베디드 시스템/아두이노 소프트웨어

아두이노 소프트웨어-xiv. 함수 -비트 조작 함수

hanjinee 2021. 1. 5. 13:08

처음 공부할 때 비트 조작 함수를 보고, 도대체 이것은 무엇인가... 했었죠.

바이트 반환? 무슨 바이트????

비트를 읽어?? 왜??

비트 기록??? 등등 알수 없는 언어 투성이...

 

자 그래서 이번 포스트에서는 이 비트 조작함수에 대해서 알아보고, 어떻게 쓰는지 알아보겠습니다.

설명은 간단합니다.

 

오늘 설명할 함수는

lowByte

highByte

bitRead

bitset

bitWrite

bitClear

bit

 

7가지 입니다.

 

lowByte(x)

데이터(x)의 최하위(Low) 바이트(Byte)를 반환합니다.

highByte(x)

데이터(x)의 두 번째 최하위 바이트(Byte)를 반환합니다.

bitRead(x, n)

데이터(x)

n: 읽어낼 비트 위치, LSB(Lease Significant Byte)부터 0에서 시작

반환값은 0또는 1의 비트값

bitWrite(x, n, b)

x: 데이터

n: 기록할 비트 위치, LSB(Lease Significant Byte)부터 0에서 시작

b: 0 또는 1의 기록할 비트 값

반환값은 없음.

x의 n번째 비트에 b값(0 or 1)을 쓴다.

bitSet(x, n)

x: 데이터

n: 기록할 비트 위치, LSB(Lease Significant Byte)부터 0에서 시작

반환값은 없음

x의 n번째 비트를 1로 설정함

bitClear(x, n)

x: 데이터

n: 기록할 비트 위치, LSB(Lease Significant Byte)부터 0에서 시작

x의 n번째 비트를 0으로 설정.

반환값 없음

bit(n)

n: 계산하고자 하는 비트의 위치

반환값은 n에 의해 지정된 비트의 비트값을 반환합니다.

즉, 지정된 위치에 해당하는 비트의 비트 값인 2^n 값을 반환합니다.

순서는 위와 같이 LSB(Lease Significant Byte)부터 시작합니다.

 

 

코드 예제를 보시죠!

byte outputBufferA[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

byte outputBufferB[16] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

int TEST = 0x7C; //랜덤 작성

byte hi, lo;

//int bitPosA[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3 };

//int bitPosB[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3 };

int bitPosA[8] = {0, 1, 2, 3, 4, 5, 6, 7};

int bitPosB[8] = {0, 1, 2, 3, 4, 5, 6, 7};

int Read=0;

void setup() {

 

 

Serial.begin(9600);

Serial.println("READY!");

}


void loop() {

for (int i = 0; i < 16; i++) {

for (int j = 0; j < 8; j++) {

outputBufferA[i] = bitSet(outputBufferA[i], bitPosA[j]); //outputBufferA[i]의 bitPosA[j]번째 비트를 1로 설정합니다.
outputBufferB[i] = bitClear(outputBufferB[i], bitPosB[j]); //outputBufferA[i]의 bitPosA[j]번째 비트를 0으로 설정합니다.

//outputBufferA[i] = bitClear(outputBufferA[i], bitPosA[j], 1); ///outputBufferA[i]의 bitPosA[j]번째 비트를 1로 설정합니다.

//Read = bitRead(outputBufferB[i], bitPosB[j]); //outputBufferA[i]의 bitPosA[j]번째 비트 읽어 변수 Read에 넣습니다.

hi = highByte(TEST); //데이터 TEST의 두 번째 최하위 데이터 반환, hi <== 0x7 반환

lo = lowByte(TEST); // 데이터 TEST의 최하위 데이터 반환, lo <== 0xC 반환

 

 

 

Serial.println(outputBufferA[i], BIN);
Serial.println(outputBufferB[i], BIN);

delay(500);
}
Serial.println();
Serial.print(outputBufferA[i], BIN);
Serial.print('\t');
Serial.print(outputBufferB[i], BIN);
Serial.print('\t');
Serial.print("outputBufferIndex ");
Serial.println(i);
Serial.println();
}
}

728x90