본문 바로가기
PS 문제 풀이/Jungol

[Jungol] 정올 3293 비트연산 1

by 까망 하르방 2021. 3. 18.
반응형

출처: http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=2583&sca=50

Approach

 비트마스크 (Bitmask) 

 

비트마스크 (Bitmask)

비트마스크 정수의 이진수 표현(Bit)을 자료 구조로 쓰는 기법 현대의 모든 CPU는 이진수를 이용해도 모든 자fy 표현 내부적으로 이진수를 사용하는 컴퓨터들은 이진법 관련 연산들을 아주 빨리

zoosso.tistory.com

 

(1) a가 홀수인지 if문과 비트 연산자를 이용하여 판별하고자 한다. ?자리에 들어갈 비트연산자는?

   if(a ? 1){}   // c, c++인 경우
   if((a ? 1) == 1 )) {} // java의 경우
if(a & 1){}
if((a & 1) == 1 )) {}
 
(2) a가 짝수인지 if문과 비트 연산자를 이용하여 판별하고자 한다. ?자리에 들어갈 비트연산자는?
   if(?a ? 1) {} // c, c++인 경우
   if((?a ?1) == 1 )) {} // java의 경우
if(~a & 1) {} 
if((~a & 1) == 1 )) {} 
 
(3) a와 2의 k제곱을 곱한 결과(결과는 int 범위를 넘지 않는다.)를 구하고자 한다. ?자리에 들어갈 비트연산자는?
   result = a ? k;
result = a << k;
 
(4) a를 2의 k제곱으로 나눈 몫 p와 나머지 r 을 구하고자 한다. ?자리에 들어갈 비트연산자들은?
      p = a ? k, r = a ? ((1 ? k) - 1);
p = a >> k, r = a & ((1 << k) - 1);
 
(5) 다음은 a와 b의 값을 서로 바꾸는 코드이다. ?자리에 들어갈 비트연산자들은?
      a = a ? b, b = a ? b, a = a ? b;
a = a ^ b, b = a ^ b, a = a ^ b;
ex) a = 10 = 1101
      b = 15 = 1011
 
(6) a의 k번째(2의 k제곱 자리) 비트가 0인지 1인지 알아보고자 한다.  ?자리에 들어갈 비트연산자들은?
     result = (a ? k) ? 1;
result = (a >> k) & 1;
 
(7) a의 k번째(2의 k제곱 자리) 비트만 0으로 바꾸고자 한다.  ?자리에 들어갈 비트연산자들은?
    a = a ? (?(1 ? k));
a = a & (~(1<<k));
 
(8) a의 k번째(2의 k제곱 자리) 비트만 0이면 1로, 1이면 0으로 바꾸고자 한다.  ?자리에 들어갈 비트연산자들은?
   a = a ? (1 ? k);
a = a ^ (1 << k);
 
(9) a가 2의 제곱수인지 판별하고자 한다. ?자리에 들어갈 비트연산자들은?
     result = a ? (a - 1);
     if( a > 0 && result==0) printf("%d is the power of 2.\n", a);  
result = a & ( a - 1 )
 
(10) a와 b의 같은 자리 비트를 비교한 결과 서로 다른 비트가 1개 이하인지 알아보고자 한다.
       ?자리에 들어갈 비트연산자들은?
       bit = a ? b; 
       result = bit ? (bit -1);
       if(result==0) printf("%d and %d differ by below 1bit.\n", a, b);  
bit = a ^ b;
result = bit & (bit -1);
 
더보기
LS1B (Least Set 1 Bit : 2^0 부터 시작하여 처음만나는 1인비트의 가중치값)를구하고자한다. 
?자리에들어갈비트연산자는? (ex, 1, 5, 6 등의 LSB는 1이고, 2, 6, 10 등의 LSB는 2이다.)
   lsb= a ? a;
   printf("%d 's LSB is % n", a, lsb );
LSB = a & -a;
ex) 74 = 01001010
     -74 = 10110101  10110110 (비트 반전 후 + 1)
            01001010 & 1011011 뒤(맨 끝)에서 1』인  부분에서 서로 일치
            따라서 LSB = 102 = 210

#include <stdio.h>
  
char op[7][4] = { "?", "~", "&", "|", "^", "<<", ">>" };
//                 0    1    2    3    4    5     6
  
int main(){
    printf("%s\n", op[2]); // (1)
    printf("%s%s\n", op[1], op[2]); // (2)
    printf("%s\n", op[5]); // (3)
    printf("%s%s%s\n", op[6], op[2], op[5]); // (4)
    printf("%s%s%s\n", op[4], op[4], op[4]); // (5)
    printf("%s%s\n", op[6], op[2]); // (6)
    printf("%s%s%s\n", op[2], op[1], op[5]); // (7)
    printf("%s%s\n", op[4], op[5]); // (8)
    printf("%s\n", op[2]); // (9)
    printf("%s%s\n", op[4], op[2]); // (10)
}

 

반응형

댓글