shift에 대해서.

java core 2006. 11. 16. 03:06


이번에 자바코딩을 하다가 제가 문득 잊고 사는 것을 하나 배웠지요.

 

하나는 바로 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 이렇게 하는 수 밖에 없지 않나 생각드네요..

 

혹시 다른 방법 있으면 멀까요?

 

Posted by 김용환 '김용환'

댓글을 달아 주세요