정수를 비트의 배열로 생각하면 편함 board가 3x3 사이즈고 각 칸마다 0,1,2 세 가지 값이 들어갈 수 있다면 최소한 한 칸을 표기하기 위해 2비트가 필요할 거고, 그럼 비트가 18개 있는 배열이면 충분히 정보를 표현할 수 있겠지.
어떤 18비트 크기의 배열이 00101101001110110110111001111010 이런식으로 있으면 이걸 2비트씩 끊어서
00/10/11/01/00/11/10/11/01/10/11/10/01/11/10/10로 해석하면 board 게임 상태를 복구시킬 수 있잖음
보통 필요한 비트 개수가 64개 안쪽이면 정수값 하나로 변환이 가능하니까 이런 식으로 생각해서 적절히 비트 연산자 스까서 (원래 상태) => (정수값), (정수값) => (원래 상태) 변환 함수를 다 짜면 됨
즈우북(14.40)2018-12-06 19:54
답글
이대로 설계한다면 o일때 01, x일때10, .일때 00으로 설정하고 반복문 돌 때마다 <<2 연산으로 왼쪽으로 두번밀고 설정했던 경우의 비트값 더해줘도 된다는 거네
ㅁㅇ(220.127)2018-12-06 20:29
답글
그렇겠지 이진법이랑 호환되게 상태 변환하면 정수에서 다시 원래 상태로 변환 안하고 바로 상태에 변경사항 반영하기 편해서 개인적으론 비트 단위로 상태 구별해서 박아넣는걸 선호함
즈우북(14.40)2018-12-06 20:49
저 코드는 좀 더 효율적으로 저장할 수 있게 전체 값을 3진법으로 보고 짠 경우
즈우북(14.40)2018-12-06 19:55
답글
저런 코드는 어떻게 설계한거지? 무슨 원리인지 모르겠음
ㅁㅇ(220.127)2018-12-06 20:22
답글
위에서 말한거랑 똑같음.. 위에건 그냥 생각하기 쉽게 이진법으로 본거고 저 코드는 그냥 삼진법으로 본거임
즈우북(14.40)2018-12-06 20:47
답글
만약에 3진법으로 된 9자리 숫자 011210112가 있다고 치자. 3진법이니까 3x3 보드에서 각 칸을 나타내는 숫자 0,1,2랑 삼진법 숫자의 한 자리랑 서로 대응이 됨 그러니까 위 숫자를 자릿수 단위로 잘라서 0/1/1/2/1/0/1/1/2 로 보면 이걸
011
210
112
의 보드로 해석하는게 가능하잖음. 그냥 이 원리대로 3진법 숫자 하나로 만드는것뿐임 기본 원리는 완전히 동일
즈우북(14.40)2018-12-06 20:48
답글
아하 쟤는 o일땐 1, x일 땐 2로 설정해놓고 3진법이니 <<3 연산으로 왼쪽으로 3칸 밀고 해당 경우의수 더해주는 거구나! 땡큐 땡큐
정수를 비트의 배열로 생각하면 편함 board가 3x3 사이즈고 각 칸마다 0,1,2 세 가지 값이 들어갈 수 있다면 최소한 한 칸을 표기하기 위해 2비트가 필요할 거고, 그럼 비트가 18개 있는 배열이면 충분히 정보를 표현할 수 있겠지. 어떤 18비트 크기의 배열이 00101101001110110110111001111010 이런식으로 있으면 이걸 2비트씩 끊어서 00/10/11/01/00/11/10/11/01/10/11/10/01/11/10/10로 해석하면 board 게임 상태를 복구시킬 수 있잖음 보통 필요한 비트 개수가 64개 안쪽이면 정수값 하나로 변환이 가능하니까 이런 식으로 생각해서 적절히 비트 연산자 스까서 (원래 상태) => (정수값), (정수값) => (원래 상태) 변환 함수를 다 짜면 됨
이대로 설계한다면 o일때 01, x일때10, .일때 00으로 설정하고 반복문 돌 때마다 <<2 연산으로 왼쪽으로 두번밀고 설정했던 경우의 비트값 더해줘도 된다는 거네
그렇겠지 이진법이랑 호환되게 상태 변환하면 정수에서 다시 원래 상태로 변환 안하고 바로 상태에 변경사항 반영하기 편해서 개인적으론 비트 단위로 상태 구별해서 박아넣는걸 선호함
저 코드는 좀 더 효율적으로 저장할 수 있게 전체 값을 3진법으로 보고 짠 경우
저런 코드는 어떻게 설계한거지? 무슨 원리인지 모르겠음
위에서 말한거랑 똑같음.. 위에건 그냥 생각하기 쉽게 이진법으로 본거고 저 코드는 그냥 삼진법으로 본거임
만약에 3진법으로 된 9자리 숫자 011210112가 있다고 치자. 3진법이니까 3x3 보드에서 각 칸을 나타내는 숫자 0,1,2랑 삼진법 숫자의 한 자리랑 서로 대응이 됨 그러니까 위 숫자를 자릿수 단위로 잘라서 0/1/1/2/1/0/1/1/2 로 보면 이걸 011 210 112 의 보드로 해석하는게 가능하잖음. 그냥 이 원리대로 3진법 숫자 하나로 만드는것뿐임 기본 원리는 완전히 동일
아하 쟤는 o일땐 1, x일 땐 2로 설정해놓고 3진법이니 <<3 연산으로 왼쪽으로 3칸 밀고 해당 경우의수 더해주는 거구나! 땡큐 땡큐
<<3이 아니라 *3(이진법 기준 <<1)으로 진법에 맞게 한 자리수 밀어주는 것
아 아니네ㅋㅋ 3진법이니 곱하기 3해서 한칸 민거네ㅋㅋ
ㅇㅇ 맞아ㅋㅋ 제대로 이해함 고맙스