2010-08-21 3 views
2

많은 도서관에서, 상수는 다음과 같이 정의하는 이유를 정말 이해 적이 한 가지입니다 :선택 값

public static final int DM_FILL_BACKGROUND = 0x2; 
public static final int DM_FILL_PREVIOUS = 0x3; 
public static final int TRANSPARENCY_MASK = 1 << 1; 
public static final int TRANSPARENCY_PIXEL = 1 << 2; 

0x로와 < < 물건까지 무엇입니까? 사람들이 일반 정수 값을 사용하지 않는 이유는 무엇입니까?

+0

어떤 식으로'0x2' * 아닌 "일반 정수 값"입니까? 그것은 완전히 정상입니다.'1 << 1'에 대해서는 당연히 하나의 값이 아닌 표현식이지만 결과는 여전히 "일반 정수 값"입니다. – Timwi

답변

6

1의 비트 시프트는 일반적으로 저장하려는 비 독점적 인 값이있는 경우를위한 것입니다.

예를 들어, 상자의 모든면에 선을 그릴 수 있기를 원한다고 가정 해보십시오. 당신은 정의

LEFT_SIDE = 1 << 0 # binary 0001 (1) 
RIGHT_SIDE = 1 << 1 # binary 0010 (2) 
TOP_SIDE = 1 << 2 # binary 0100 (4) 
BOTTOM_SIDE = 1 << 3 # binary 1000 (8) 
           ---- 
           0111 (7) = LEFT_SIDE | RIGHT_SIDE | TOP_SIDE 

그런 다음 여러 측면 그들을 결합 할 수 있습니다 :

DrawBox (LEFT_SIDE | RIGHT_SIDE | TOP_SIDE) # Don't draw line on bottom. 

가 완전히 다른 비트를 사용하고 있다는 사실은 서로 독립적임을 의미한다. OR을 입력하면 1 | 2 | 47과 같으며 다른 부울 연산으로 각 비트를 감지 할 수 있습니다 (이에 대한 설명은 herehere 참조).

1, 2, 3 및 4로 정의 된 경우 각면에 대해 하나의 호출을해야하거나 한 면당 4 개의 매개 변수를 전달해야합니다. 그렇지 않으면 두 값이 같은 값 (단순한 가산 연산)을 가지므로 LEFT and RIGHT (1 + 2 = 3)과 TOP (3)의 차이를 알 수 없습니다.

0x 물건 이진 비트 마스크를 쉽게 볼 수 있습니다 단지 16 진수입니다 (각 16 진수 정확히 사 개 진 자리에 해당합니다. 당신은 0x01처럼 0x02, 0x04, 0x08, 0x10, 0x20을 패턴을 참조하는 경향이 있습니다 및 그들은 하나의 1 비트가 가장 중요한 비트 위치를 향해 이동에 해당하는 것 때문에 등등 -이 값은 너무 이진 00000001, 00000010, 00000100, 00001000, 00010000, 00100000과 동등

0123.

옆 : 16 진수로 익숙해지면 1 << n에 대해 거의 걱정할 필요가 없습니다. 즉시 0x4000을 이진수 0100 0000 0000 0000으로 인식 할 수 있습니다. 나의 선호하는 방법이 : 당신이 코드에서 값 16384을 보면 우리 중 일부는 심지어 그 :-)

+0

글쎄. 나는 플래그를위한 1 << BitNo 포맷을 좋아한다. 왜냐하면 그 정의를 보아 어느 비트인지를 알기 때문이다. _ Public Enum _Flag As Integer로 정의 된 일반 스 니펫을 가지고 있습니다. 개의 미리 정의 된 플래그가 있습니다. – dbasnett

2

에 관한 << 물건을 인식하지만 그건 덜 분명하다.

비트 2 위치에 1을두고 다른 모든 비트에 0을 정의해야 할 때 4, 0x4 또는 1<<2으로 정의 할 수 있습니다. 1<<2은 내 의견으로는 더 읽기 쉽고이 상수의 목적을 정확히 설명합니다.

둘 모두 컴파일 타임에 계산이 수행되므로이 ​​모든 방법이 동일한 성능을 제공합니다.

+0

''<< 2'가 더 읽기 쉽습니다. 값이 '7'이 아니라 '4'라면, 확실히 더 정확합니다 :-) – paxdiablo

+0

나는 믿을 수 없습니다! 물론, 4. 맥주와 프로그래밍을 섞어서는 안됩니다! –