본문 바로가기

C

C: bitmask forloop with enum

728x90
반응형

1, 2, 4, 8, 16... 과 같이 bitmask를 활용한 enum에서

forloop를

  '++' 연산 대신

  '<<=1' 연산을 통해 효율적으로 이용하는 예시

 

#define TU_BIT(n)             (1UL << (n))

/// Keyboard modifier codes bitmap
typedef enum
{
  KEYBOARD_MODIFIER_LEFTCTRL   = TU_BIT(0),	// 1UL <<(0) -> 1
  KEYBOARD_MODIFIER_LEFTSHIFT  = TU_BIT(1),	// 1UL <<(1) -> 2
  KEYBOARD_MODIFIER_LEFTALT    = TU_BIT(2),	// 1UL <<(2) -> 4
  KEYBOARD_MODIFIER_LEFTGUI    = TU_BIT(3),	// 1UL <<(3) -> 8
  KEYBOARD_MODIFIER_RIGHTCTRL  = TU_BIT(4),	// 1UL <<(4) -> 16
  KEYBOARD_MODIFIER_RIGHTSHIFT = TU_BIT(5),	// 1UL <<(5) -> 32
  KEYBOARD_MODIFIER_RIGHTALT   = TU_BIT(6),	// 1UL <<(6) -> 64
  KEYBOARD_MODIFIER_RIGHTGUI   = TU_BIT(7)	// 1UL <<(7) -> 128
} hid_keyboard_modifier_bm_t;

 

위와 같이 1부터(00000001) 128까지(10000000) bitmask shift 연산(<<=1)을 활용해서 순환

for (hid_keyboard_modifier_bm_t modifier = KEYBOARD_MODIFIER_LEFTCTRL; modifier <= KEYBOARD_MODIFIER_RIGHTGUI; modifier <<=1) {
    printf("modifier: %x\n", modifier);
}

// modifier: 1
// modifier: 2
// modifier: 4
// modifier: 8
// modifier: 10
// modifier: 20
// modifier: 40
// modifier: 80

 

위와 같이 비트마스크 shift 연산을 통해서 순환이 가능

(16진수 표현 출력에 의해서 16 -> 10, 32-> 20, 64->40, 128-> 80 출력)

728x90
반응형