본문 바로가기

Tip !!!/C# tip

특정비트값 세팅 토글 변경

예로 설명해 보겠습니다.

두개의 변수 a,b          a= 0b11010001      b=0b00110011

변수의 3번째 비트 ( index는 2)를 반전 시켜 보겠습니다.

mask= 0b10000000;  // 마스크 초기값

mask= mask >> index;  //   mask =0b00100000    index만큼 오른쪽으로 이동

[ a 경우  ]

a & mask  Result  0b00000000    (  0임 )  

a + = mask; 하면   a는 0b11110001 이 됨 (bit 반전)

또는

a | = mask ;  OR연산도 같은 값

 

[ b 경우 ]

b & mask  Result  0b00100000    ( 0이 아님)

b - = mask; 하면    b는 0b00010011 이 됨 (bit 반전 )

또는 

b & = ! mask;  도 같은 값

 

 이것을 기초로 코딩하면


mask 는 세팅을 원하는 2진수 자리수 의 최상위 bit를 1로 한다.
ex)    8자리 이진수 경우 0b10000000
          5자리 이진수 경우 0b10000
index는 최상위 bit를 0으로 오른쪽으로 증가


토글 시키기 : a+=  ( a& (mask >>index)  ==0 )  ? mask: -mask;

(진행순서)
mask >>  index ;                              
if( (a & mask) ==0)  a+=mask;  // 또는 a|=mask;  
else                          a-=mask;   // 또는  a&=!mask;


특정비트 1로 세팅하기   :  a|=( mask  >> index );

(진행순서)

mask  >> index

a|= mask ;      //  bit OR 연산자


특정비트 0으로 세팅하기 : a&=!(  mask  >> index );

(진행순서)

mak  >> index

mask= !mask  //  bit NOT연산자  ex)  0b0010 이면 0b1101로 됨

a&= mask ; // bit AND 연산자


자리수에 따라 mask를 따로 정하지 말고 

mask는 항상 1 로 세팅하고 비트연산은  왼쪽으로 ( << ) 하는

방법도 있지만

이때는 index를  (자리수 - index )씩으로 처리 하든지

아님 최하위비트를 0으로  왼쪽으로 갈수록 증가 시켜야 한다.

 

아마 왼쪽에서 오른쪽으로 글을 읽는 우리는 제일

처음 방법이 이후 coding이 편하고 이해도 쉬울 것이다.