comkiwer- 비트연산 1 > 문제은행 : 정보올림피아드&알고리즘



3293 : 비트연산 1

제한시간
1000 ms   
메모리제한
4 MB   
해결횟수
631 회   
시도횟수
1208 회   

문제

비트연산(Bitwise Operation)은 한 개 또는 두 개의 이진수에 대하여 비트단위로 적용되는 연산이다.

 

다음은 6가지 비트 연산자에 대한 설명이다.

 

 

 

위 6개 비트 연산자를 사용하여 아래 질문에 답하시오.

질문에 사용된 모든 변수는 음이 아닌 정수이다.

문항별 사용되는 비트연산자는 1개를 초과할 수 있다.

 

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

   if(a ? 1){}   /// c, c++인 경우 

   if((a ?1) == 1 )) {} /// java의 경우

 

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

   if(?a ? 1) {} /// c, c++인 경우​

   if((?a ?1) == 1 )) {} /// java의 경우​

 

(3) a와 2의 k제곱을 곱한 결과(결과는 int 범위를 넘지 않는다.)를 구하고자 한다.​ ?자리에 들어갈 비트​연산자​는?​​

   result = a ? k;

 

(4) a를 2의 k제곱으로 나눈 몫 p와 나머지 r 을 구하고자 한다. ?자리에 들어갈 비트​연산자​들은?​​​

   p = a ? k, r = a ? ((1 ? k) - 1);

 

(5) 다음은 a와 b의 값을 서로 바꾸는 코드이다. ?자리에 들어갈 비트​연산자들은​?​​​

   a = a ? b, b = a ? b, a = a ? b;

 

(6) a의 k번째(2의 k제곱 ​자리) 비트가 0인지 1인지 알아보고자 한다.  ?자리에 들어갈 비트​연산자​들은​?​​​​

   result = (a ? k) ? 1;

 

(7) a의 k번째(2의 k제곱 ​자리) 비트만 0으로 바꾸고자 한다.  ?자리에 들어갈 비트​연산자​들은​?​​​​

   a = a ? (?(1 ? k));

 

(8) a의 k번째(2의 k제곱 ​자리) 비트만 0이면 1로, 1이면 0으로 바꾸고자 한다.  ?자리에 들어갈 비트​연산자​들은​?​​​​

   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);  

 

(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);  ​

 

 

 ​ 

 

 위 질문에 대하여 아래 코드의 op[0]에서 0​위치에 적절한 비트 연산자 번호를 작성하여 제출한다.

 

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



 

 


출력형식

만약 모든 답이 ?라면 출력예와 같이 출력된다.

출력 예

?
??
?
???
???
??
???
??
?
??

Hint!

[보충]

(11) a의 LS1B(Least Significant 1 Bit : 20부터 시작하여 처음 만나는 1인 비트의 가중치 값)를 구하고자 한다. 

     ?자리에 들어갈 비트​연산자​는​?​​​​​ 

     예를 들어 1, 5, 7 등의 LSB 는 1이고 2, 6, 10 등의 LSB 는 2이다.

     lsb = a ? -a; 

     printf("%d 's LSB is %d.\n", a, lsb);  ​

 

printf("%s\n", op[0]); /// (11)​ 

 

* cf : __builtin_ffs(X) : gcc내장함수이다.
                          X의 20자리부터 시작하여 처음으로 1인 비트가 나오는 indext + 1을 반환한다.
                          1인 비트가 없는 경우 0을 반환한다. 
                          예를 들어 1의 경우는 1, 6의 경우는 2, 8의 경우 3을 반환한다.

* cf : LSB(Least Significant Bit) : 20자리 비트



출처

comkiwer

경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호

TEL : 031-360-4144 FAX : 031-388-0996 E-mail : hancomc@hotmail.com, comkiwer@naver.com

Copyrightⓒ 2010 jungol. All right reserved.

TOP