문제

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"당신은 가치의 징후를 가질 것이고, 당신은 0을 얻습니다."value & (1<<x)"(X가 너무 큰 경우 비트 부호를 얻는 것이 유용합니다).

이 경우 0을 선호하는 경우 ">>>"운영자, 대신">>"

그래서, "((value>>>x) & 1) != 0" 그리고 "(value & (1<<x)) != 0"완전히 동일합니다

nTh LSB (최소 유의미한 비트), 다음은 작동해야합니다.

boolean isSet = (value & (1 << n)) != 0;

비트셋을 확인하고 싶을 수도 있습니다. 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 (동일 할 필요는 없습니다).

자바가 아닌 프로그래머를위한주의 단어: 앞의 표현식은 해당 언어에서 비트 시프트 연산자가 5에만 적용되기 때문에 Java에서 작동합니다. long) 오른쪽 피연산자의 가장 낮은 비트. 이것은 암시 적으로 표현식을 변환합니다 value << (~x & 31) (또는 value << (~x & 63) 만약에 value ~이다 long).

자바 스크립트: JavaScript에서도 작동합니다 (Java와 같이 5 비트의 Shift Count 만 적용). JavaScript에서 number 32 비트입니다.

특히 C에서 음의 이동 수는 정의되지 않은 동작을 호출 하므로이 테스트는 반드시 작동하지는 않습니다 (특정 컴파일러/프로세서의 특정 조합에 따라).

2^x 비트의 값은 "변수 & (1 << x)"입니다.

임시 int를 선언하고 원본과 동일하게 만드십시오. 그런 다음 확인하려는 비트가 마지막 위치에 있도록 온도 >> x 시간을 이동하십시오. 그런 다음 임시 & 0xf를 사용하여 앞의 비트를 떨어 뜨립니다. 이제 마지막 비트로 떠났습니다. 마지막으로 (y & 1 == 0), 마지막 비트가 1이면 0이면 0과 같아야합니다. 그렇지 않으면 1과 같아야합니다. 주위에 바보를보십시오

누군가가 비트 연산자에게 편안하지 않은 경우 아래 코드를 프로그래밍 방식으로 결정하려고 시도 할 수 있습니다. 두 가지 방법이 있습니다.

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;
  }

  }

몇 가지 질문이 있다면 이메일을 작성하십시오.

좋은 프로그래밍!

비트 변속과 그 복잡성을 제거하고 사용하십시오 lut 오른쪽 and 피연산자.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top