자료구조 과제1 : 비트수준 연산 수행함수 구현
본 과제는 컴퓨터 구조를 잘 이해하기 위해서 비트 수준의 데이터 표현 및 연산에 익숙해지는 것을 목표로 합 니다. 이를 위해서 여러분들은 몇 가지 비트 수준의 연산을 수행하는 함수를 구현합니다
요구 사항
- c언어로 다음 함수를 구현
- if, while, for, switch 같은 조건문과 반복문, 그리고 형변환은 사용할 수 없 습니다. 다음 연산자만을 이용할 수 있습니다. ! ~ & ^ | + - << >> && ||
※구현할 함수
- int getBit(int x, int n) : 정수 x의 n번째 비트 값을 반환함.
- int setBit(int x, int n) : 정수 x의 n번째 비트를 1로 설정한 뒤 그 결과를 반환함.
- int clearBit(int x, int n) : 정수 x의 n번째 비트를 0으로 설정한 뒤 그 결과를 반환함.
- int toggleBit(int x, int n) : 정수 x의 n번째 비트를 반전(1이면 0, 0이면 1로)시키고 결과값을 반환함.
- 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번째 비트를 반전시키고 결과값을 반환
앞에서 비트를 옮긴 방식으로 data_n을 설정해주고 , XOR연산을 사용하고 값을 리턴한다.int toggleBit(int x, int n) { int data_n = 1; data_n <<= n; return x ^= data_n; }
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;
}
'학교생활!' 카테고리의 다른 글
[230503] 자료구조 과제5: 순환(recursion) (0) | 2023.05.07 |
---|---|
[230414] 자료구조 과제4: LinkedList클래스 (0) | 2023.04.17 |
[230402]고급C++프로그래밍: 구조체 과제 (0) | 2023.04.07 |
[230330]자료구조 과제3: Print (0) | 2023.04.02 |
[230325]자료구조 과제2: BankAccount (1) | 2023.03.25 |