navs님같은 기발한 코딩은 못하지만 아래 해석 원하시는분이 계셔서
건방지게 보일지 모르지만 제가 해석한 내용을 적어볼게요.
일단 %c%c 로 출력하는걸 보면 앞의 %c는 변수 i로 드라이브되고, 뒤의 %c는 변수 j로 드라이브 됩니다.
결과부터 말씀드리면 앞의 %c는 SP(공백)이랑 *(별)만 찍고요
뒤의 %c는 NULL(아무것도 안찍음)과 NL(줄바꿈)만 찍습니다.
아래 그림과 같이 i,j로 컨트롤되는 %c%c가 순서대로 찍히면 별이 되는데요,
그럼 비트는 뭘하는거냐...하면 앞에 보셨든 각각의 %c는 찍는게 딱 두개씩있자나요.
그래서 뭘찍을지 판단하는걸 bit연산으로 하는겁니다(0일땐 뭘찍고 1일땐 뭘찍고)
원리는 navs님께서 i, j 변수에 각각 뭔가 오묘한 숫자를 넣었는데 그걸 펼치면 아래 그림과 같아요.
그리고 i >>= 1 이거는 i에 있는 비트를 우측으로 1번 시프트한 결과를 다시 i에 넣는거고,
i&1, j&1 연산이 하는 역할은 맨 우측에 있는 숫자가 1인지 0인지 판단하는겁니다.
0000 & 1 = 0
0001 & 1 = 1
이거든요.
그래서 아래와 같이 01010001 이런 반복이 %c%c를통해 뭘찍는지에 대한 규칙이라고 이해하면 편하실거에요.
실제로 navs님 코드에서 앞의 %c는 i에 저장된 값의 맨 우측 비트가 0이면 공백을찍고 1이면 별을찍습니다.
우측 %c는 j에 저장된 값의 맨 우측 비트가 0이면 아무것도 안찍고 1이면 줄바꿈을 해요.
결국에는 i,j의 초기값과 시프트-어사인 연산과 & 연산을 조합해서 하신거라고 볼수 있겠네요.
스케치도 지저분하고 설명이 잘 되었나 모르겠지만, 도움이 되셨길 바라고
제가 혹시 잘못알고 있는 부분 있으면 알려주시면 감사하겠습니다.