이번에 자바코딩을 하다가 제가 문득 잊고 사는 것을 하나 배웠지요.
하나는 바로 operator precedent (연산자 우선순위)구요.
저도 모르게 + 연산자가 우선순위가 높다라는 사실을 늘 잊어버린적이 많죠.. 14개 연산자 등급중 4위라는 사실입니다.. ㅡ.ㅡ;
a & 0xFF00 >> 8 + 1* 2
=> 연산순서
(1) 1 * 2
(2) 8 + 1 * 2
(3) 0xFF00 >> 8 + 1* 2
(4) a & 0xFF00 >> 8 + 1 * 2
이렇게 됩니다.~
까먹지 않기 위해서 다시 공부합니다~
우선순위 연산자
1 . () []
2 ! ~ ++ --
3 * / %
4 + -
5 < < >> >>>
6 < &$60;= > >=
7 == !=
8 &
9
10 ㅣ
11 &&
12 ㅣㅣ
13 ?:
14 = += -= * = /= %= &= = ㅣ= <<= >>=
또 하나는 바로 쉬프트 연산입니다.
쉬프트 연산중 자바의 특성과 관련된 쉬프트가 있습니다. 즉, 최상위비트(Left Most bit )가 1일때 (즉, 음수) 쉬프트연산을 우측으로 할 지를 잘 결정해야 할 것 같더라구요.
즉,
shift는 총 3가지 종류가 있는데, left shift, right shift, zero fill right shfit가 있습니다.
-----------------------------
public class Shift {
public static void main(String[] args) {
int b, c;
int a = 0xFF000000;
b = a << 1;
c = a >> 1;
System.out.println("b:" + Integer.toHexString(b));
System.out.println("c:" + Integer.toHexString(c));
}
}
결과
b:fe000000
c:ff800000
------------------------------
public class Shift {
public static void main(String[] args) {
int b, c;
int a = 0xFF000000;
b = a << 1;
c = a >>> 1;
System.out.println("b:" + Integer.toHexString(b));
System.out.println("c:" + Integer.toHexString(c));
}
}
결과
b:fe000000
c:7f800000
c언어의 경우는 다음과 같이 테스트를 해볼 수 있지요.
int main()
{
int b;
int c;
int a = 0xFF000000;
b = a << 1;
c = a >> 1;
printf("b:%x\n", b);
printf("c:%x\n", c);
}
b:fe000000
c:ff800000
근데 말이져..
c언어에서. 자바의 >>> 연산자가 따로 없는 듯 하네요... 저한테 c책이 없는데, 확인해 볼 길이 없네요.
즉, shift 연산을 할 때, arithmetic 값이 아닌, logical 값일때에 대한 shift는 c언어에서 따로 제공하는 것은 없지 않을까란 생각이 듭니다. 즉 c언어는 2의 보수표현의 arithmetic값에 치중되어 있지 않나 생각이 들어요.
예문을 보면, 원하는 것은 eF80000 값인데, 이 값으로 한번에 변환시켤 줄 수 있는 방법이 떠오르지 않네요. 늘, 코더가 저걸 생각하고, (a >> 1) & 0xeffffffff 이렇게 하는 수 밖에 없지 않나 생각드네요..
혹시 다른 방법 있으면 멀까요?