22/01/04
1. right circular shift 프로그램
- right circular shift : 주어진 정수의 비트를 오른쪽으로 n번 이동
- ex)
- 10 3(입력) → 00000000000000000000000000001010 (원본)
01000000000000000000000000000001 (결과) - -10 3(입력) → 11111111111111111111111111110110 (출력)
11011111111111111111111111111110 (결과)
- 10 3(입력) → 00000000000000000000000000001010 (원본)
- 조건
- scanf() 사용
- 원본과 결과 모두 2진수로 출력
- 오른쪽으로 이동되는 비트가 0이면 0추가, 1이면 1추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main() {
// 변수 선언
scanf("%d %d", &num, &n);
// 원본 2진수 출력
for (i=0; i<n; i++) {
// right circular shift
}
// shift 결과 출력
return 0;
}
소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h>
int main() {
int num, n, i;
unsigned int check = 0x80000000; // 1000...0000
int rcheck = 0x7FFFFFFF; // 0111...1111
scanf("%d %d", &num, &n);
// 원본 2진수 출력
for (i=0; i<32; i++) {
if((num&check) == 0)
putchar('0');
else
putchar('1');
check = check >> 1;
}
putchar('\n');
check = 0x80000000;
// 1. right circular shift
for (i=0; i<n; i++) {
if (num >= 0) { // 2.양수
if ((num&1) == 0) // 2-1. 끝 비트가 0인가?
num = num >> 1;
else { // 2-2. 1인가?
num = num >> 1;
num |= check;
}
} else { // 3. 음수
if ((num&1) == 0) {
num = num >> 1;
num &=rcheck; // 3-1. 음수에서 rcs 시 0 추가하기
} else
num = num >> 1;
}
}
// shift 결과 출력
for (i=0; i<32; i++) {
if((num&check) == 0)
putchar('0');
else
putchar('1');
check = check >> 1;
}
putchar('\n');
return 0;
}
- right circular shift 시 경우의 수
- 양수
- 0000..0010 >> 1 → 0000..0001 : 0이 자연스럽게 추가 됨
- 0000..0001 >> 1 → 1000..0000 : 1이 추가되어야 함
- 음수
- 1000..0001 >> 1 → 1100..0000 : 1이 자연스럽게 추가 됨
- 1000..0000 >> 1 → 0100..0000 : 0이 추가되어야 함
- 양수
- 양수일 경우
- 양수의 끝자리 비트가 0인 경우(num&1)
- 자연스럽게 0이 추가됨으로 shift만 사용
- 양수의 끝자리 비트가 1인 경우
- 어떠한 상황에서도 1을 추가해 줘야 한다.(언제나 T)
- 0, 1 → 1
- 1, 1 → 1
- 한 가지라도 1(T)이라면 1(T)로 표현하는
|로 쉬프트 후 1000..0000 추가
- 어떠한 상황에서도 1을 추가해 줘야 한다.(언제나 T)
- 양수의 끝자리 비트가 0인 경우(num&1)
- 음수일 경우
- 음수의 끝자리 비트가 0인 경우
- 어떠한 상황에서도 0을 추가해 줘야 한다.(언제나 F)
- 0, 0 → 0
- 1, 0 → 0
- 한 가지라도 0(F)이라면 0(F)으로 표현하는
&로 쉬프트 후 0111..1111 추가
- 어떠한 상황에서도 0을 추가해 줘야 한다.(언제나 F)
- 음수의 끝자리 비트가 1인 경우(num&1)
- 자연스럽게 1이 추가됨으로 shift만 사용
- 음수의 끝자리 비트가 0인 경우
실행 순서
- 양수
- 4 3 입력
- 0000…0100
- & 0000…0001 (check)
-------------------
F - num >> 1
- 0000…0010
- & 0000…0001 (check)
-------------------
F - num >> 1
- 0000…0001
- & 0000…0001 (check)
-------------------
T - num >> 1
- 0000…0000
- num |= check ( 0000…0000 | 1000…0000 )
- 결과
- 00000000000000000000000000000100
10000000000000000000000000000000
- 00000000000000000000000000000100
- 음수
- -2 2 입력
- 1111…1110
- & 0000…0001 (check)
-------------------
F - num >> 1
- 1111…1111
- num &= rcheck ( 1111…1111 & 0111…1111)
- 0111…1111
- & 0000…0001 (check)
-------------------
T - num >> 1
- 결과
- 11111111111111111111111111111110
10111111111111111111111111111111
- 11111111111111111111111111111110
2. 10진수를 2진수로 변환하는 함수 만들기
- 이전에 연습했던 10진수 → 2진수 프로그램을 함수로 만들고 left circular shift를 실행하시오
- 조건
- 함수명 : bi_print
- 리턴타입 : void
- main에서 scanf()로 정수를 받고 bi_print()로 2진수 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
// 함수 선언
int main() {
// 변수 선언
scanf("%d n", num, n);
// 원본 2진법 출력;
// left circular shift
// left circular shift 출력;
return 0;
}
// 함수 정의
소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
void bi_print(int); // 함수 선언
int main() {
int num, n;
unsigned int check = 0x80000000;
scanf("%d n", num, n);
// 원본 2진법 출력;
bi_print(num);
// left circular shift
for (i=0; i< n;i++) {
if ((num&check)==0) {
num = num << 1;
}
else {
num = num << 1;
num |= 1;
}
}
// left circular shift 출력;
bi_print(num);
return 0;
}
// 함수 정의
void bi_print(int num) {
int i;
unsigned int check = 0x80000000; // main의 check와는 별개의 변수
for (i=0; i<32; i++) {
if((num&check) == 0)
putchar('0');
else
putchar('1');
check = check >> 1;
}
putchar('\n');
}
이전 코드의 main 길이 비교

3. left circular shift 함수 만들기
- 위의 코드에서 left circular shift 코드도 함수로 만드시오
- 조건
- 함수명 : lcs
- 리턴타입 : int
소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
void bi_print(int);
int lcs(int, int); // 함수 선언
int main() {
int num, n;
scanf("%d n", num, n);
// 원본 2진법 출력;
bi_print(num);
// left circular shift
num = lcs(num, n);
// left circular shift 출력;
bi_print(num);
return 0;
}
// 함수 정의
void bi_print(int num) {
int i;
unsigned int check = 0x80000000;
for (i=0; i<32; i++) {
if((num&check) == 0)
putchar('0');
else
putchar('1');
check = check >> 1;
}
putchar('\n');
}
int lcs(int num, int n) {
int i;
unsigned int check = 0x80000000;
for (i=0; i< n;i++) {
if ((num&check)==0) {
num = num << 1;
}
else {
num = num << 1;
num |= 1;
}
}
}
이전 코드의 main 길이 비교

Comments powered by Disqus.