아두이노 bit 계산(아두이노)

in #kr-arduino6 years ago

아두이노 bit 계산(아두이노)



지난시간에 int형을 byte로 쪼개고 다시 쪼개진 byte를 int형으로 합치는 코딩을 간단히 이야기 한 적이 있습니다.

  int x = 0B0000000100000001;//257
  
  //쪼개기
  byte a = x>>8;
  byte b = x;
    
  //합치기
  int c = (a<<8)|b;
  
  Serial.println(a);
  Serial.println(b);
  Serial.println(c);

[결과]

1 <=a
1 <=b
257 <=c

아두이노는 int형이 2byte형으로 구성되어 있으며 쪼개기/합치기 코딩을 하면 결과는 위와 같이 결과로 출력됩니다. 여기서 좀 더 깊게 자료형 변수의 값을 byte 단위로 쪼개지는 것에서 더 나아가 쪼개진 byte를 bit로 접근해보고 싶어지더군요. 그래서, 아두이노 홈페이지에 레퍼런스를 살펴보니 bit 관련 함수들이 제공되어서 bit 계산 함수를 정리하는 시간을 가져보고 싶어서 post를 쓰게 되었네요.

bit 관련 함수에 대해서 본격적으로 살펴 봅시다.

1. bit 함수


아두이노 함수는 총 7개를 제공해줍니다. 각 함수에 대해서 살펴 봅시다.

1) bit(n) 함수 : n번째 위치의 bit 값을 출력


예) 5이면 => bit(5) =>32

이렇게 n번째 위치의 bit 값을 반환합니다.

2) bitRead(x,n) : X 데이터 값에 n번째 위치의 bit 읽기


byte x = 0B00001111;  

byte x의 값은 아래 표로 나타냅니다.

여기서 bitRead(x,n)함수를 사용하여 특정 위치의 bit를 읽어 봅시다.

byte x = 0B00001111;  

Serial.println(bitRead(x, 1));

[결과]

1 <= 1번째위치 bit값

3) bitClear(x,n) : x 데이터 값에 n번째 위치의 bit 값을 지우기


byte x = 0B00001111;  

byte x의 값은 아래 표로 나타냅니다.

bitClear(x,1);

이렇게 x값을 1번째 위치의 bit를 지우게 됩니다.

byte x = 0B00001111; // 15
Serial.println(x); 
bitClear(x,1);
Serial.println(x); 

[결과]

15 <= x
13 <=bitClear(x,1)

대충 어떤 느낌인지 아시겠지요.

4) bitSet(x,n) : x 데이터 값에 n번째를 1로 세팅


위의 bitClear(x,n)함수는 0으로 초기화 한다면 bitSet(x,n) 반대로 1로 세팅하는 함수입니다.

위 표로 보시면 값이 어떻게 변하는지 쉽게 확인이 되시죠.

byte x = 0B00001111; // 15
bitClear(x,1);
Serial.println(x); 
bitSet(x,1);
Serial.println(x); 

[결과]

15 <=x
13 <=bitClear(x,1)
15 <=bitSet(x,1)

5) highByte(y)와 lowByte(y) 함수


  • highByte(y) : y 변수값의 최상위 byte 값을 반환합니다. 하지만 큰 자료형일 경우 두번째로 작은 byte를 반환하게 됩니다.
  • lowByte(y) : y 변수값의 최하위 byte 값을 반환합니다.

한번 어떤값이 나오는지 확인 해 볼까요.

예를 들면,

  int y= 0B0000111100000111;

int형은 2byte로 구성되어 있습니다. 각각 8bit로 나누어 상위 byte와 하위 byte루 구분 할 수 있습니다. 즉, 방금 이야기 한 highByte(y)와 lowByte(y) 함수로 상위 byte와 하위 byte가 반환되는지 확인하시면 되겟죠.

  int y= 0B0000111100000111;
    
  Serial.println(highByte(y));
  Serial.println(lowByte(y));

[결과]

15 <=00001111
7  <=00000111

대충 어떤 느낌으로 반환되는지 아시겠지요.

6) bitWrite(x, n, b) : x 데이터 값에서 n번째 위치값을 b(0 or 1)로 변경


byte x = 0B00001111;  

byte x의 값을 bitWrite(x, 1, 0) 함수를 사용하면 아래 표처럼 결과를 얻게 됩니다.

  byte x = 0B00001111;  

  bitWrite(x, 1, 0); 
  Serial.println(x);

[결과]

13 <=00001101

2. 실험


1) 코딩


위에서 설명한 함수들을 순서대로 출력해 보았습니다.

void setup()
{
  Serial.begin(9600);

  byte x = 0B00001111;  
  int y = 0B0000111100000111;
  
  //x값 출력
  Serial.println(x); 
  
  //5번째 bit값 출력
  Serial.println(bit(5));
  
  //x 데이터의 1번째 bit를 출력
  Serial.println(bitRead(x, 1));
  
  //x 데이터의 1번째 bit를 0으로 초기화
  bitClear(x,1);  
  Serial.println(x);

  //x 데이터의 1번째 bit를 1로 세팅
  bitSet(x,1);  
  Serial.println(x);

  //y 데이터의 상위byte와 하위byte를 출력
  Serial.println(highByte(y));
  Serial.println(lowByte(y)); 
  
  //x 데이터 1번째 bit를 0로 변환
  bitWrite(x,1,0); 
  Serial.println(x);
}

void loop()
{

}

2) 결과


결과를 보시면 숫자만 쭉 나열 되어 있는데 위 코딩에 주석으로 단 글을 읽으면서 순서대로 어떻게 값이 바뀌는지 비교하면서 결과를 확인하시기 바랍니다.


마무리


오늘은 지난시간에 I2C 통신에서 int형 값을 byte로 쪼개고 다시 합치는 과정에서 문득 조금 더 bit단위까지 컨트롤 해보고 싶어져서 이렇게 정리를 하게 되었네요. 위 함수들은 막상 사용하려고 하면 어디에서 사용하지 잘 떠오르지 않을거에요. 그나마 위 함수중에서 가장 많이 사용했던 것은 bitRead()함수입니다. 아두이노를 할때 특정 패턴을 만들 때 0 or 1로 만드는 경우가 많고 특정 패턴을 저장한 변수의 크기를 줄이기 위해서 bit 패턴을 종종 만듭니다. 이렇게 만들어진 bit 패턴을 읽기 위해서 bitRead()함수를 자주 사용 했었습니다. 하지만 다른 함수들은 사용하는 사례가 그렇게 많지 않지만 오늘 배운 함수들 알아 두시면 나중에 도움이 될꺼에요. bit 단위로 컨트롤 할 수 있기 때문에 아두이노에서 접근하는 데이터를 가장 작은 bit 단위로 접근할 수 있고 변수 공간을 효율적으로 관리할 수 있어서 자원 낭비를 최소화 할 수 있습니다.

Sort:  

@codingman님 안녕하세요 ㅎㅎ
스팀잇 계정만 있으면 에어드랍 해주는 바이트볼 받으셨나요 ^^?
https://steemit.com/kr/@ganzi/3upsb7
위 링크에 쉽게 설명해 놓았습니다!
바이트볼 > 스팀달러 로 환전도 해드립니다 ㅎㅎ

바이트볼 post 본적있어요.

좋은정보네요. 팔로우하고 갈게요 @codingman님 자주소통해요~

감사합니다.

즐거운 스팀잇 생활하시나요?
무더위야 가라!!!!

방문해 주셔서 감사해요.

Coin Marketplace

STEEM 0.32
TRX 0.11
JST 0.034
BTC 66791.24
ETH 3239.69
USDT 1.00
SBD 4.22