본문 바로가기
반응형

C29

여러가지 나머지 연산 방법 테스트 C, C++ 전체 링크 1. % 사용 2. 비트연산 사용 (2의 배수) 3. / 를 이용하여 다시 계산하기 #include #include #include typedef unsigned long long int ull; #define DIVISOR (1024) void remainderTest1(ull testcase[], ull answer[]) { for (int i = 0; i < 10000; i++) { ull ans = testcase[i] % DIVISOR; if (ans != answer[i]) printf("Fail!!\n"); } } void remainderTest2(ull testcase[], ull answer[]) { for (int i = 0; i < 10000; i++) { u.. 2023. 8. 15.
C, C++ - 비트 교환 (Change Some Bits) C, C++ 전체 링크 삼성 C형 전체 링크 참고 - 비트 연산 기본 매크로 함수 - 비트 단위로 출력하기 1. char 타입 4bit 교환 2. 4bit 단위로 교환 3. 1bit 교환 char 타입 4bit 교환 char는 1byte = 8bit이므로 아래와 같이 4bit씩 양 옆으로 옮겨주면 비트가 교환된다. 예를 들어 char a = 0xA9라면 0x9A가 된다. typedef unsigned char uc; uc change4Bit(unsigned char value) { return (value > 4); } 전체 코드는 다음과 같다. #include typedef unsigned char uc; uc change4Bit(unsigned char value) { return (value > 4.. 2023. 8. 15.
C, C++ - 비트 뒤집기 (Reverse Bits) C, C++ 전체 링크 삼성 C형 전체 링크 참고 - 비트 단위로 출력하기 - 1 비트 개수 세기 1 비트 개수를 세는 방법을 응용하면 비트를 뒤집는 것도 가능하다. long, int, short, char ver 구현을 참고하자. #include typedef unsigned long long int ll; template void printBitNumber(T number) { unsigned int bitSize = sizeof(number) * 8; T mask = (1ull) = 1; if (i % 8 == 7) printf(" "); } putchar('\n'); } ll getBitConvertLong(ll number) { ll convert = number; convert = (conve.. 2023. 7. 30.
C, C++ - 2차원 비트맵 뒤집기, 회전하기 (Rotate, Flip 2D Bitmap) C, C++ 전체 링크 삼성 C형 전체 링크 참고 - N x N 2차원 배열 뒤집기, 회전하기 (Rotate, Flip 2D Array) 아래의 char 배열은 2차원 배열로 16 x 2의 크기를 가진다. 하지만 비트 단위로 볼 때, char는 1byte이므로 16 x (2 x 8) = (16 x 16)인 정사각형의 비트맵으로 볼 수 있다. char bitmap[16][2]; N x N 2차원의 배열을 뒤집거나 회전하는 것은 간단하지만, 비트 연산의 경우 1 byte를 8개로 나눠서 구현해야 한다. 높이와 너비(x 8)가 같은 2차원 비트맵을 반전시키거나 회전시켜보자. bitmap의 SIZE = HEIGHT와 같다. 하지만 너비 WIDTH는 비트 단위로 계산하기 때문에 HEIGHT를 8로 나눈다. 그렇게.. 2023. 7. 30.
C, C++ - 1차원 비트 회전하기 (Rotate Bits of a Number) C, C++ 전체 링크 삼성 C형 전체 링크 비트를 회전시켜보자. 비트의 회전은 unsigned 타입만 가능하다. 먼저 아래 코드를 실행시켜 보자. #include template void printBitNumber(T number) { unsigned int bitSize = sizeof(number) * 8; T mask = (1ull) = 1; if (i % 8 == 7) printf(" "); } putchar('\n'); } template T getBitRotateLeft(T number, int n) { unsigned int bitSize = sizeof(number) * 8; return (number > (bitSize - n)); } template T getBitRotateRight.. 2023. 7. 30.
C, C++ - 1 비트 개수 세기 (Bit Counter) C, C++ 전체 링크 삼성 C형 전체 링크 주어진 숫자에 대해 비트 단위로 1이 몇 개 인지 세는 함수를 만들어보자. 먼저 비트 단위로 출력하기를 이용하여 아래의 코드를 실행해보자. #include #include using namespace std; typedef long long int ll; template void printBitNumber(T number) { unsigned int bitSize = sizeof(number) * 8; T mask = (1ull) = 1; if (i % 8 == 7) printf(" "); } putchar('\n'); } int main(void) { ll bit = 1234123412341234123; printf("bit : "); printBitNumb.. 2023. 7. 29.
C, C++ - 비트 연산으로 2의 제곱수 처리하기 C, C++ 전체 링크 삼성 C형 전체 링크 2n 또는 2n - 1 판단하기. 숫자 x에서 -1을 하고 & 연산을 해서 0이 되면 2n이다. 그리고 x에서 +1을 하고 & 연산을 해서 0이 되면 2n - 1이다. 2n은 bit로 나타내면 하나의 bit만 1이기 때문에 이런 규칙이 생긴다. 0100 0000 = 64 0011 1111 = 63 ------------------ 0000 0000 = 64 & 63 = 0 마찬가지로 2n - 1도 연산을 해보면 쉽게 규칙을 파악할 수 있다. 0111 1111 = 127 1000 0000 = 128 ------------------- 0000 0000 = 127 & 128 = 0 #include int main(void) { int x; /* 주어진 부호 없는 .. 2023. 7. 29.
C, C++ - 임시 변수 없이 변수 바꾸기 (Swap Two Numbers without using the Third Variable) C, C++ 전체 링크 삼성 C형 전체 링크 long long int 타입 a, b 변수를 교체해보자. #include typedef long long int ll; int main(void) { ll a = 1234123412341234; ll b = 5678567856785678; printf("a : %lld\n", a); printf("b : %lld\n", b); putchar('\n'); ll tmp = a; a = b; b = tmp; printf("a : %lld\n", a); printf("b : %lld\n", b); return 0; } 값이 잘 변경된 것을 알 수 있다. XOR Swap 알고리즘을 이용하면 변수를 추가하지 않고 아래와 같이 간결하게 두 변수를 교환할 수 있다. a ^.. 2023. 7. 29.
C, C++ - 비트 연산 기본 매크로 함수 (bit macro : get, set, clear, toggle, check) C, C++ 전체 링크 삼성 C형 전체 링크 비트 연산 기본에 대해서 알아보자. (get, set, clear, toggle, check) - 비트 1개 연산 - 연속된 여러 비트 연산 - 비트 마스크 연산 비트 1개 연산 다음의 코드를 실행시켜보자. #include typedef long long int ll; #define SET_BIT(value, n) ((value) |= (1ull 2023. 7. 29.
반응형