Java에서 value & 0xff는 무엇을합니까?
다음 Java 코드가 있습니다.
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
인쇄하면 결과는 254이지만이 코드가 어떻게 작동하는지 모르겠습니다. 경우 &
운영자는 단순히 비트, 왜 그것은 바이트 대신 정수 발생하지 않습니다입니까?
의 하위 8 비트에 result
의 8 비트를 넣은 결과 (부호없는) 값으로 설정 됩니다 .value
result
이와 같은 것이 필요한 이유 byte
는 Java에서 서명 된 유형 이기 때문 입니다. 방금 쓴 경우 :
int result = value;
그런 다음 대신 result
값으로 끝납니다 . 더 미묘한 점은가 값 1 에서만 작동하도록 정의되어 있다는 것입니다.ff ff ff fe
00 00 00 fe
&
int
value
int
(ff ff ff fe
) (으 ) 로 승격됩니다 .0xff
이다int
리터럴 (00 00 00 ff
).- 에
&
대한 원하는 값을 산출하기 위해이 적용됩니다result
.
(포인트 전환 인 것을 int
발생 하기 전에&
연산자 적용된다.)
1 글쎄요. &
오퍼레이터 작동 long
피연산자가 인 경우뿐만 값 long
. 하지만 byte
. Java 언어 사양, 섹션 15.22.1 및 5.6.2를 참조하십시오 .
에서 http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
16 진수 리터럴 0xFF는 동일한 int (255)입니다. Java는 int를 32 비트로 나타냅니다. 바이너리에서 다음과 같이 보입니다.
00000000 00000000 00000000 11111111
임의의 숫자에 대해이 값 (255)으로 비트 와이즈 AND를 수행하면 숫자의 가장 낮은 8 비트를 제외한 모든 것을 마스킹 (제로 만들기)합니다 (있는 그대로).
... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101
&는 %와 비슷하지만 실제로는 아닙니다 .
그리고 왜 0xff? 이것은 ((2의 거듭 제곱)-1)입니다. 모든 ((2의 거듭 제곱)-1) (예 : 7, 255 ...)는 % 연산자처럼 동작합니다.
그런
다음 바이너리에서 0은 모두 0이며 255는 다음과 같습니다.
00000000 00000000 00000000 11111111
그리고 -1은 다음과 같습니다.
11111111 11111111 11111111 11111111
0xFF의 비트 AND와 0에서 255 사이의 값을 수행하면 결과는 값과 정확히 동일합니다. 255보다 큰 값이 여전히 있으면 결과는 0-255 내에 있습니다.
그러나 다음과 같은 경우 :
-1 & 0xFF
당신은 얻을
00000000 00000000 00000000 11111111
, -1의 원래 값과 같지 않습니다 ( 11111111
십진수로 255).
조금 더 많은 조작 : (질문과 관련이 없음)
X >> 1 = X/2
X << 1 = 2X
특정 비트가 설정되었는지 (1) 또는 설정되지 않았는지 (0) 확인한 다음
int thirdBitTobeChecked = 1 << 2 (...0000100)
int onWhichThisHasTobeTested = 5 (.......101)
int isBitSet = onWhichThisHasTobeTested & thirdBitTobeChecked;
if(isBitSet > 0) {
//Third Bit is set to 1
}
특정 비트 설정 (1)
int thirdBitTobeSet = 1 << 2 (...0000100)
int onWhichThisHasTobeSet = 2 (.......010)
onWhichThisHasTobeSet |= thirdBitTobeSet;
특정 비트를 다시 설정 (0)
int thirdBitTobeReSet = ~(1 << 2) ; //(...1111011)
int onWhichThisHasTobeReSet = 6 ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;
XOR
XOR 연산을 두 번 수행하면 동일한 값이 생성됩니다.
byte toBeEncrypted = 0010 0110
byte salt = 0100 1011
byte encryptedVal = toBeEncrypted ^ salt == 0110 1101
byte decryptedVal = encryptedVal ^ salt == 0010 0110 == toBeEncrypted :)
One more logic with XOR is
if A (XOR) B == C (salt)
then C (XOR) B == A
C (XOR) A == B
The above is useful to swap two variables without temp like below
a = a ^ b; b = a ^ b; a = a ^ b;
OR
a ^= b ^= a ^= b;
It help to reduce lot of codes. It is occasionally used in RGB values which consist of 8bits.
where 0xff means 24(0's ) and 8(1's) like 00000000 00000000 00000000 11111111
It effectively masks the variable so it leaves only the value in the last 8 bits, and ignores all the rest of the bits
It’s seen most in cases like when trying to transform color values from a special format to standard RGB values (which is 8 bits long).
In 32 bit format system the hexadecimal value 0xff
represents 00000000000000000000000011111111
that is 255(15*16^1+15*16^0)
in decimal. and the bitwise & operator masks the same 8 right most bits as in first operand.
참고URL : https://stackoverflow.com/questions/11380062/what-does-value-0xff-do-in-java
'IT박스' 카테고리의 다른 글
얼마나 많은 GCC 최적화 수준이 있습니까? (0) | 2020.09.07 |
---|---|
addEventListener를 사용하여 노드에 연결된 이벤트 리스너 가져 오기 (0) | 2020.09.07 |
Bash 또는 Shell 스크립트에서 함수 선언을 전달 하시겠습니까? (0) | 2020.09.07 |
if 문을 사용한 목록 이해 (0) | 2020.09.07 |
고정 너비 범위에서 긴 텍스트 / 단어를 줄 바꿈하거나 나누려면 어떻게해야합니까? (0) | 2020.09.07 |