우리는 프로그램의 모든 숫자가 컴퓨터 메모리에 이진 형식으로 저장되고, 비트 연산은 메모리에 있는 정수의 이진 비트에 직접 연산된다는 것을 알고 있습니다. 예를 들어 and 연산은 원래 논리 연산자이지만 AND 연산은 정수 사이에서도 수행될 수 있습니다.
비트 연산에는 주로 교대 연산과 논리 연산이 포함됩니다. 다음으로 시프트 연산과 논리 연산에 대해 각각 이야기하겠습니다.
Shift 연산:
왼쪽 Shift: 연산자는 <<, 왼쪽으로 이동, 오른쪽의 낮은 비트에 0을 추가, 왼쪽의 높은 비트 삭제, 이진수를 정수로 처리, 1비트 이동 왼쪽은 2를 곱한 것과 같습니다. 부호 없는 오른쪽 시프트: 연산자는 >>>이며 오른쪽으로 이동하고 오른쪽을 버리고 왼쪽에 0을 추가합니다. 부호 있는 오른쪽 시프트: 연산자는 >>이며 오른쪽으로 이동하여 오른쪽에 추가된 값은 원래의 최상위 비트에 따라 달라집니다. 원래 1이면 1을 추가하고 0이면 입니다. , 0을 더합니다. 이진수를 정수의 경우 오른쪽으로 1비트 이동하는 것은 2로 나누는 것과 같습니다.
예:
int a = 4; // 100 a = a >> 2; // 001,等于1 a = a << 3 // 1000,变为8
논리 연산에는 다음이 포함됩니다.
Bitwise AND &: 두 비트가 모두 1인 경우에만 1
Bitwise OR|: 한 비트가 1인 한 1
비트 부정~: 1은 0이 되고, 0은 1이 됩니다
비트 XOR^: 다른 것은 참이고, 같은 것은 거짓입니다
예:
int a = ...; a = a & 0x1 // 返回0或1,就是a最右边一位的值。 a = a | 0x1 //不管a原来最右边一位是什么,都将设为1
몇 가지 간단한 응용 프로그램을 살펴보겠습니다. 시나리오:
시나리오 1 : 홀수와 짝수 결정
분석: 홀수는 2의 정수배가 아닙니다. 이진수로 변환한 후 가장 낮은 비트는 1이 되어야 하며, 짝수의 경우 그 반대가 됩니다. 이 기능을 사용하면 비트 연산을 통해 정수의 패리티를 쉽게 결정할 수 있습니다.
코드 보기:
int i = 1;// 二进制存储方式为00000000000000000000000000000001 int j = 5;// 二进制存储方式为00000000000000000000000000000101 int k = 6;// 二进制存储方式为00000000000000000000000000000110 if ((i & j) == 1) { System.out.println("j的最低位为1,为奇数"); } if ((i & k) == 0) { System.out.println("k的最低位为0,为偶数"); }
시나리오 2: 양의 정수가 2의 정수 거듭제곱인지 확인
분석: 먼저 2의 공통 정수 거듭제곱을 살펴보겠습니다: 2, 4, 8, 16, 변환 이진법 숫자는 10, 100, 1000, 10000입니다. 패턴을 찾았나요? 즉, 첫 번째 비트가 1인 것을 제외하면 나머지 비트는 모두 0이다. 이 숫자에서 1을 빼면 비트 단위 반전의 결과가 동일해집니다. 예를 들어 이진수 111인 8-1=7은 이진수 1000을 8로 반전하여 얻을 수 있습니다. 그리고 8&7=0, 규칙을 추출하면 다음과 같습니다:
(n&(n-1))==0
이 규칙을 따르는 n은 2의 정수 거듭제곱입니다.
(비디오 공유 학습: java 비디오 튜토리얼)
시나리오 3: 간단한 컬렉션 처리
말도 안 돼요. 코드를 보세요.
public class SimpleSet { public static final int A = 0x01;// 最后四位为0001 public static final int B = 0x02;// 最后四位为0010 public static final int C = 0x04;// 最后四位为0100 public static final int D = 0x08;// 最后四位为1000 private int set = 0x00;// 初始0000,空集合 public void add(int i) {// 将i对应位的值置为1,重复add不影响。默认传入值为ABCD之一,此处省去边界判断 set |= i; } public boolean contain(int i) {// 判断相应位置是否为1 return (set & i) == i; } public boolean remove(int i) {// 来不及不解释了快看代码 if (contain(i)) { set -= i; return true; } else { return false; } } }
테스트해 보세요:
public static void main(String[] args) { SimpleSet set = new SimpleSet(); System.out.println(set.contain(A)); set.add(B); System.out.println(set.contain(A)); System.out.println(set.contain(B)); set.add(A); set.add(C); System.out.println(set.contain(A)); set.remove(A); System.out.println(set.contain(A)); System.out.println(set.remove(A)); System.out.println(set.contain(C)); }
출력은 다음과 같습니다.
false false true true false false true
좋아, 질문 없습니다.
위 샘플 코드의 A, B, C, D가 열거와 다소 유사하다고 생각할 수도 있습니다. 실제로 열거를 위한 jdk 소스 코드의 컬렉션 클래스 EnumSet은 유사한 솔루션을 사용하지만 이는 물론 더 복잡합니다. 이 외에도 더 많은 것들이 있습니다. 관심이 있으시면 소스 코드를 확인해 보세요. 이 솔루션에는 비트 벡터라는 이름이 있습니다.
그나저나 Java의 int 패키징 클래스인 Integer에는 비트 연산을 제공하는 정적 도구가 많이 있으며, 그 중 대부분은 매우 복잡합니다. 관심이 있다면 확인해 보세요
결론:
비트 연산은 컴퓨터가 가장 잘하는 연산으로, jdk의 소스 코드에서도 광범위하게 사용됩니다. 이를 이해하면 컴퓨터를 더 깊이 이해하는 데 도움이 되고, 더 우아한 코드를 작성하는 데도 도움이 됩니다.
관련 권장 사항: Java 입문 튜토리얼
위 내용은 Java의 비트 연산 및 응용 시나리오 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!