자바 : 긴 비트가 0 또는 1인지 확인
2 ^ x를 나타내는 비트가 1인지 0인지 확인하려면 어떤 방법을 사용 하시겠습니까?
나는 사용합니다 :
if ((value & (1L << x)) != 0)
{
// The bit was set
}
(대괄호 수가 적을 수도 있지만 비트 연산의 우선 순위는 기억하지 못합니다.)
또 다른 대안 :
if (BigInteger.valueOf(value).testBit(x)) {
// ...
}
나는 궁금:
if (((value >>> x) & 1) != 0) {
}
.. 가치가 길든 아니든 중요하지 않기 때문에 더 좋고, 덜 분명하기 때문에 더 나쁘다면 더 좋습니다.
Tom Hawtin-tackline 7 월 7 일 14:16
당신은 또한 사용할 수 있습니다
bool isSet = ((value>>x) & 1) != 0;
편집 : " (value>>x) & 1
"와 " value & (1<<x)
" 의 차이는 x가 "값"유형의 크기 (귀하의 경우 32)보다 클 때 동작에 의존합니다.
이 특별한 경우에 " (value>>x) & 1
"를 사용하면 값의 부호를 갖게되는 반면, " value & (1<<x)
" 와 함께 0 을 얻습니다 (x가 너무 크면 비트 부호를 얻는 것이 유용 할 때가 있습니다).
이 경우 0을 선호 >>>
하는 경우 " >>
" 대신 " "연산자를 사용할 수 있습니다.
따라서 " ((value>>>x) & 1) != 0
"및 " (value & (1<<x)) != 0
"는 완전히 동일합니다.
을 위해 n
일 LSB (최하위 비트), 다음 작업을해야합니다 :
boolean isSet = (value & (1 << n)) != 0;
BitSet을 확인하십시오 : http://java.sun.com/javase/6/docs/api/java/util/BitSet.html
x만큼 오른쪽으로 비트 이동 하고 가장 낮은 비트를 확인합니다.
Java에서는 다음이 잘 작동합니다.
if (value << ~x < 0) {
// xth bit set
} else {
// xth bit not set
}
value
그리고 x
될 수 있습니다 int
또는 long
(와 동일 할 필요가 없습니다).
비 Java 프로그래머를위한주의 사항 : 위의 표현식은 Java에서 작동합니다. 해당 언어에서는 비트 시프트 연산자 long
가 오른쪽 피연산자의 최하위 5 비트 (의 경우 6)에만 적용되기 때문입니다 . 이것은 암시 적으로 표현식을 value << (~x & 31)
(또는 value << (~x & 63)
if value
is long
) 로 변환합니다 .
자바 스크립트 : 자바 스크립트 에서도 작동합니다 (예 : 자바와 마찬가지로 가장 낮은 5 비트의 시프트 카운트 만 적용됨). 자바 스크립트에서 any number
는 32 비트입니다.
특히 C에서 음의 시프트 카운트는 정의되지 않은 동작을 호출하므로이 테스트가 반드시 작동하지는 않습니다 (컴파일러 / 프로세서의 특정 조합에 따라 달라질 수 있음).
2 ^ x 비트의 값은 "변수 & (1 << x)"입니다.
temp int를 선언하고 원본과 동일하게 만듭니다. 그런 다음 temp >> x 번 이동하여 확인하려는 비트가 마지막 위치에 있도록합니다. 그런 다음 temp & 0xf를 수행하여 이전 비트를 삭제하십시오. 이제 마지막 비트를 남겼습니다. 마지막으로 if (y & 1 == 0), 마지막 비트가 1이면 0이되어야하고, 그렇지 않으면 1이됩니다. 그것 또는 if (y + 0x1 == 0) ... 너무 확실하지 않습니다. 바보짓을하고 봐
누군가 비트 연산자에 익숙하지 않은 경우 아래 코드를 사용하여 프로그래밍 방식으로 결정할 수 있습니다. 두 가지 방법이 있습니다.
1) Java 언어 기능을 사용하여 바이너리 형식 문자열을 얻은 다음 특정 위치에서 문자를 확인하십시오.
2) 2로 계속 나누어 특정 위치에서 비트 값을 결정합니다.
public static void main(String[] args) {
Integer n =1000;
String binaryFormat = Integer.toString(n, 2);
int binaryFormatLength = binaryFormat.length();
System.out.println("binaryFormat="+binaryFormat);
for(int i = 1;i<10;i++){
System.out.println("isBitSet("+n+","+i+")"+isBitSet(n,i));
System.out.println((binaryFormatLength>=i && binaryFormat.charAt(binaryFormatLength-i)=='1'));
}
}
public static boolean isBitSet(int number, int position){
int currPos =1;
int temp = number;
while(number!=0 && currPos<= position){
if(temp%2 == 1 && currPos == position)
return true;
else{
temp = temp/2;
currPos ++;
}
}
return false;
}
산출
binaryFormat=1111101000
isBitSet(1000,1)false
false
isBitSet(1000,2)false
false
isBitSet(1000,3)false
false
isBitSet(1000,4)true
true
isBitSet(1000,5)false
false
isBitSet(1000,6)true
true
isBitSet(1000,7)true
true
isBitSet(1000,8)true
true
isBitSet(1000,9)true
true
내 기여-이전 기여 무시
public class TestBits {
public static void main(String[] args) {
byte bit1 = 0b00000001;
byte bit2 = 0b00000010;
byte bit3 = 0b00000100;
byte bit4 = 0b00001000;
byte bit5 = 0b00010000;
byte bit6 = 0b00100000;
byte bit7 = 0b01000000;
byte myValue = 9; // any value
if (((myValue >>> 3) & bit1 ) != 0) { // shift 3 to test bit4
System.out.println(" ON ");
}
}
}
비트 작업을 수행하는 약간의 정적 클래스를 코딩했습니다.
public final class Bitfield {
private Bitfield() {}
// ********************************************************************
// * TEST
// ********************************************************************
public static boolean testBit(final int pos, final int bitfield) {
return (bitfield & (1 << pos)) == (1 << pos);
}
public static boolean testNum(final int num, final int bitfield) {
return (bitfield & num) == num;
}
// ********************************************************************
// * SET
// ********************************************************************
public static int setBit(final int pos, final int bitfield) {
return bitfield | (1 << pos);
}
public static int addNum(final int number, final int bitfield) {
return bitfield | number;
}
// ********************************************************************
// * CLEAR
// ********************************************************************
public static int clearBit(final int pos, final int bitfield) {
return bitfield ^ (1 << pos);
}
public static int clearNum(final int num, final int bitfield) {
return bitfield ^ num;
}
}
If there are some questions flying around, just write me an email.
Good Programming!
Eliminate the bitshifting and its intricacies and use a LUT for the right and
operand.
참고URL : https://stackoverflow.com/questions/1092411/java-checking-if-a-bit-is-0-or-1-in-a-long
'Programing' 카테고리의 다른 글
JObject에서 비어 있거나 널 (null) JToken 확인 (0) | 2020.11.07 |
---|---|
초 정수를 HH : MM, iPhone으로 변환 (0) | 2020.11.06 |
Date 개체에 요일 추가 (0) | 2020.11.06 |
업로드되는 dropzone.js 파일 수를 제한하는 방법은 무엇입니까? (0) | 2020.11.06 |
UIButton 제목 정렬 및 여러 줄 지원 (0) | 2020.11.06 |