* 위의 코드에서 rgba 에 대한 비트를 16진수로 [rrrrrrrr][gggggggg][bbbbbbbb][aaaaaaaa]형태로 짰다.
* 또한 처음에는 fromRGBA함수를 짰지만 성능상 define을 이용할 수 있다면 이용하는 것이 더 좋으므로
* #define fromRGBA(r,g,b,a) ((((r)&0xff)<<24)|(((g)&0xff)<<16)|(((b)&0xff)<<8)|((a)&0xff)); 로 정의 하였다.
>* 위에서 | 대신 +를 사용하여도 되지만 + 기호는 shift보다 우선순위가 높으므로 괄호를 잘 사용하여야만 한다!!!
>* 또한 r, g, b, a모두에 괄호를 사용하여 (r),(g),(b),(a)로 나타내었는데 이렇게 메크로엔 괄호를 하는 이유는 #define사용시에는 문자그대로 전달되기 때문에 r+2와 같은 값을 받아 들일때에 r+2&0xff 가 되어 계산이 꼬이는 경우가 생기기 쉽기 때문이다.
* 또한 조건문은 성능을 나빠지게 하므로 위의 코드에서 0~255사이 범위를 넘어가는 input을 받았을 때 처리해 주는 과정을 if문을 사용하지 않고 &0xff를 하여 처리해 주었다.
>> * 위에서의 "&" (and operation)은 각 자리수를 & 연산 한 것과 같다. (즉 0&0=0 1&0=0 0&1=0 1&1=1)
>> * 따라서 r,g,b,a에 각각 &0xff를 하면 r,g,b,a의 input 값과 0xff를 비교하여 둘 다 1인것만 1로 반환하므로 범위를 넘어가는 input은 모두 0으로 반환하여 잘 처리 할 수 있다.
* 위에서 fromRGBA를 정의한 것을 다시 살펴보면
> * 범위 처리를 위하여 각각의 r,g,b,a에 0xff 를 and operation 해주어 0~255범위가 넘어가는 것을 방지하고
> * 각각의 비트 위치에 따라 24번째 자리 부터 시작하는 red는 24번 왼쪽 shift 를 하였고(***왼쪽 shift 한번은 곱하기 2와 같다.)
> * green은 16번째 자리부터 시작하므로 16번 왼쪽 shift를 하였고
> * blue는 8번째 자리부터 시작하므로 8번 왼쪽 shift를 하여 자리수를 맞추어 주었다.
> * 마지막으로 a는 0~7번째 자리를 차지하는 비트이므로 0xff와 and operation만을 해주었다.
(cf)
* 16진수로 1자리는 2진수로 4자리 이다.
>> 16진수로 2자리는 2진수로 8자리
* 왼쪽 shift n이 곱하기 2^n 과 같듯이 오른쪽 shift는 나누기 2^n 의 몫과 같다.
* 보통은 역수를 구해야 하는 나누기가 곱하기보다 4배 정도 느리므로 나누기를 먼저 #define을 통해 곱하기로 처리하는게 성능에 더 좋다.
mul_float 코드
* 위의 mul_float는 두 개의 rgb를 나타내는 bit의 곱을 연산하는 코드이다.
* 먼저 두 rgb값의 각각의 r,g,b,a는 오른쪽 shift를 통해서 r, g, b, a로 각각을 나누어 준다.
* 그 다음 255로 나누어 (255번째 bit 가 1이므로) 각각의 r,g,b,a 로 쪼갠것에 대해 r1*r2, g1*g2, b1*b2, a1*a2 를 해준다.
* 그리고는 다시 255를 곱해주고 int로 변환하여 두 rgb의 곱한 rgb값을 return 하는 형태이다.