본문 바로가기
학교생활!

[230325]컴퓨터 구조: Bit-Level Representations and Manipulations in C

by Daybreak21 2023. 4. 7.

자료구조 과제1 : 비트수준 연산 수행함수 구현

본 과제는 컴퓨터 구조를 잘 이해하기 위해서 비트 수준의 데이터 표현 및 연산에 익숙해지는 것을 목표로 합 니다. 이를 위해서 여러분들은 몇 가지 비트 수준의 연산을 수행하는 함수를 구현합니다

 

요구 사항

  • c언어로 다음 함수를 구현
  • if, while, for, switch 같은 조건문과 반복문, 그리고 형변환은 사용할 수 없 습니다. 다음 연산자만을 이용할 수 있습니다. ! ~ & ^ | + - << >> && ||

※구현할 함수

  1. int getBit(int x, int n) : 정수 x의 n번째 비트 값을 반환함.
  2. int setBit(int x, int n) : 정수 x의 n번째 비트를 1로 설정한 뒤 그 결과를 반환함.
  3. int clearBit(int x, int n) : 정수 x의 n번째 비트를 0으로 설정한 뒤 그 결과를 반환함.
  4. int toggleBit(int x, int n) : 정수 x의 n번째 비트를 반전(1이면 0, 0이면 1로)시키고 결과값을 반환함.
  5. int isPowerOfTwo(int x) : 정수 x가 2의 거듭제곱이면 1을 반환하고, 그 외의 경우라면 0을 반환함.

 

완성된 화면

 

 


자료형은 int형으로 4바이트지만 그림은 8비트로 설명

int getBit(int x, int n) : 정수x의 n번째 비트 값을 반환

int getBit(int x, int n) {
    int data_n = 1;
    data_n <<= n;

    x = x & data_n;
    x >>= n;
    return x;
}

data_n를 구하고자하는 n번째의 비트값만 1로 바꿔준다. (1을 비트이동연산자를 사용하여)  
AND연산자를 사용해서 n번째의 비트를 구해준다. (x의 비트값이 1이면 1, 0이면 0이라고 나옴) 
비트이동연산자를 사용해서 값을 출력한다. 

 

 

int setBit(int x, int n) : 정수x의 n번째 비트를 1로 설정한 뒤 그 결과를 반환

int setBit(int x, int n) {
    int data_n = 1;
    data_n <<= n;

    x |= data_n;

    return x;
}


data_n를 구하고자하는 n번째의 비트값만 1로 바꿔준다. (1을 비트이동연산자를 사용하여)  
OR연산자를 사용해서 n번째의 비트를 구해준다.  

 

 

int clearBit(int x, int n) : 정수x의 n번째 비트를 0으로 설정한 뒤 그 결과를 반환

int clearBit(int x, int n) {
    int data_n = 1;
    data_n <<= n;

    x &= ~data_n;
    
    return x;
}

setBit함수와 같은 방식이지만 NOT연산자를 사용해 data_n을 11110111의 형태로 바꿔준다

x와 AND연산을 하여 바꾸고 싶은 n 번째 값을 0으로 바꿔준다. 

 

 

int toggleBit(int x, int n) : 정수x의 n번째 비트를 반전시키고 결과값을 반환

int toggleBit(int x, int n) {
    int data_n = 1;
    data_n <<= n;

    return x ^= data_n;
}
앞에서 비트를 옮긴 방식으로 data_n을 설정해주고 , XOR연산을 사용하고 값을 리턴한다. 



 

 

int isPowerOfTwo(int x) : 정수x가 2의 거듭제곱이면 1을 반환하고, 그 외의 경우라면  0을 반환

int isPowerOfTwo(int x) {
	return x == (x & (-x)) && x != 0 && x != 1;
}


2의 거듭제곱은 x에 2의보수(-x)를 취해주고 x값과 AND연산을 해주면 원래x값과 같아진다. 

0과 1은 이방법으로 구분할 수 없다.. && x!=0 && x!=1 라는 조건을 추가해주어 0과 1일 때는 false로 리턴되게 하였다. 


 

 

 

                        

  • main함수
더보기

함수를 실행하는 코드

#include <stdio.h>

int main() {

    printf("getBit(170, 3) = %d\n", getBit(170, 3));
    printf("getBit(0, 0) = %d\n", getBit(0, 0));

    printf("setBit(170, 1) = %d\n", setBit(170, 1));
    printf("setBit(-1, 0) = %d\n", setBit(-1, 0));
    printf("setBit(1, 1) = %d\n", setBit(1, 1));

    printf("clearBit(170, 3) = %d\n", clearBit(170, 3));
    printf("clearBit(-1, 0) = %d\n", clearBit(-1, 0));
    printf("clearBit(1, 0) = %d\n", clearBit(1, 0));

    printf("toggleBit(170, 1) = %d\n", toggleBit(170, 1));
    printf("toggleBit(-1, 1) = %d\n", toggleBit(-1, 1));
    printf("toggleBit(1, 1) = %d\n", toggleBit(1, 1));

    printf("isPowerOfTwo(16) = %d\n", isPowerOfTwo(16));
    printf("isPowerOfTwo(-16) = %d\n", isPowerOfTwo(-16));

	return 0;
}