dreamhack.io 의 reversing wargame을 풀다가 깨달았다
1001 1101 을 3만큼 왼쪽으로 rotation 연산을 하면 1110 1100 이 된다
1100 1001 을 4만큼 오른쪽으로 rotation 연산을 하면 1001 1100 이 된다
즉, shitf 연산과는 달리 1 또는 0이 밀려나서 사라지지 않는다
이 때 만약 오른쪽을 rotation 연산을 할 경우의 값을 계산하게 된다면
이동할 만큼 오른쪽으로 shift을 하고, 8에서 이동할 만큼을 뺀 값을 왼쪽을 shift한 뒤에
그 두 값을 or 연산한다면 원하는 만큼 오른쪽으로 rotation한 값을 얻을 수 있다
1101 1010 을 오른쪽으로 3만큼 rotation 한다고 가정하자
오른쪽으로 3만큼 shift 연산하면 0001 1011 이 되고
왼쪽으로 5만큼 shift 연산하면 0100 0000 이 된다
이 둘을 or 연산한다면 0101 1011 이 된다
char _rotr(unsigned char c,int num){
unsigned char tmp1=c,tmp2=c;
num = num%8;
tmp1 = c >> num;
tmp2 = (c << (8 - num));
c = (unsigned char)(tmp1 | tmp2);
return c;
}
양수표현이 필요하면 unsigned char 꼭 사용하자
'Programming > C language' 카테고리의 다른 글
[ 15주차 ] 전처리기와 분할컴파일 (0) | 2019.12.17 |
---|---|
[ 14주차 ] 파일입출력 (0) | 2019.12.17 |
[ 13주차 ] 연산자함수자료형 (0) | 2019.12.17 |
[ 12주차 ] 동적할당 (0) | 2019.12.17 |
[ 11주차 ] 구조체 (0) | 2019.12.16 |