자바 비트 연산 의 기초 및 사용 (의미)

18503 단어 자바
자바 비트 연산 의 기초 및 사용 (의미)
  • 서문
  • 1. 비트 연산 기초
  • 2. 비트 연산 응용
  • 3. 비트 연산 문제
  • 머리말
    요 며칠 HashMap 의 소스 코드 를 보고 있 었 지만, 안의 위치 연산 이 너무 많아 서 좀 어 지 럽 게 보 였 다.그러므로 우선 비트 연산 에 관 한 지식 을 정리한다.비트 연산 의 계산 을 이해 한 후에 비트 연산 을 사용 하 는 의미 가 무엇 인지 생각 하고 있다. 왜냐하면 평소에 개발 한 것 은 비트 연산 을 거의 사용 하지 않 았 기 때문이다.대량의 자 료 를 찾 아 자신 이 비교적 좋다 고 생각 하 는 두 개의 비트 연산 이용 예 를 정리 하고 이 를 기록 하여 공유 합 니 다.또한 비트 연산 코드 는 가 독성 이 떨 어 지 므 로 조심스럽게 사용 하 시기 바 랍 니 다.
    비트 연산 기초
    1. 비트 연산 은 정수 의 이 진 을 대상 으로 하 는 변위 조작 2. 정수 32 비트 이 고 양수 기 호 는 0 이 며 음수 기 호 는 1 이다.10 진법 2 진법 은 32 자리 가 안 되 고 가장 높 은 부호 의 위 치 를 보충 합 니 다. 나머지 0, 3 을 보충 합 니 다. 자바 에서 정수 의 2 진법 은 코드 의 형식 으로 존재 하 는 4, 비트 연산 으로 계산 합 니까? 아니면 코드 를 보충 하 는 형식 입 니까? 원 코드 로 전환 해 야 합 니까? 10 진법 값 5, 정수: 원 코드 = 리 코딩 = 리 코딩 마이너스: 리 코딩 = 원 코드 는 부호 의 위 치 를 무시 하고 리 코딩 = 리 코딩 + 1 을 얻 을 수 있 습 니 다.
    예 를 들 어 10 진 4 전 2 진 은 컴퓨터 에서 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 으로 표시 합 니 다.
    예 를 들 어 10 진 - 4 전 2 진 은 컴퓨터 에서 (패 치) 11111111111 11111111111 111111111111111111100 으로 표시 된다.
    음수 전 이 진 과정 (- 4 를 예 로 들 면)
      :10000000 00000000 00000000 00000100(    ,       )  
      :11111111 11111111 11111111 11111011(     ,    )  
      :11111111 11111111 11111111 11111100(  +1)
    

    - 4 < < 1 계산 과정
    -4     11111111 11111111 11111111 11111100  
         11111111 11111111 11111111 11111000 (       )
    #          0,         ,       =  ,      1,     
         11111111 11111111 11111111 11110111 (  -1)  
         10000000 00000000 00000000 00001000 (       )  
         -8  
    
  • 왼쪽으로 이동 (<) 전체 왼쪽으로 이동, 오른쪽 빈 자리 보 영, 왼쪽 자리 버 림 (- 4 < < 1 = - 8)
  • 오른쪽으로 이동 (>) 전체 오른쪽으로 이동 하고 왼쪽 빈 자리 에서 0 을 보충 하거나 1 을 보충 합 니 다 (음수 보 1, 정수 보 0). 오른쪽 자리 포기 (- 4 > > 1 = - 2)
  • 부호 없 이 오른쪽으로 이동 (> >) 동일 > >, 그러나 양수 든 음수 든 왼쪽 자 리 는 0 (- 4 > > > > 1 = 2147483646)
  • 과 (&) 를 한 명 씩 비교 해 보면 두 명 모두 1 이 고 결 과 는 1 이 며 그렇지 않 으 면 0 (- 4 & 1 = 0)
  • 이다.
  • 또는 (|) 한 명 씩 비교 해 보면 두 명 중 한 명 은 1 이 고 결 과 는 1 (- 4 | 1 = - 3)
  • 이다.
  • 비 (~) 한 명 씩 비교 하고 위치 에 따라 반 (기호 위치 도 반) (~ - 4 = 3)
  • 이 또는 (^) 한 명 씩 비교 해 보면 같은 0, 다른 1 (^ - 4 = - 3)
  • 2. 비트 연산 응용
    한 시스템 에서 사용 자 는 일반적으로 조회 (Select), 추가 (Insert), 수정 (Update), 삭제 (Delete) 네 가지 권한 이 있 고 네 가지 권한 은 여러 가지 조합 방식 이 있 는데 그것 이 바로 16 개의 서로 다른 권한 상태 (2 의 4 차원) 이다.
    Permission
    일반적으로 네 개의 boolean 형식 변 수 를 사용 하여 저장 할 생각 입 니 다.
    public class Permission {
    
    	//       
    	private boolean allowSelect;
    
    	//       
    	private boolean allowInsert;
    
    	//       
    	private boolean allowDelete;
    
    	//       
    	private boolean allowUpdate;
    
    	//   Getter Setter
    }
    

    위 에 서 는 네 개의 boolean 형식 변 수 를 사용 하여 모든 권한 상 태 를 저장 합 니 다.
    NewPermission
    다음은 다른 방식 입 니 다. 비트 마스크 를 사용 하면 바 이 너 리 수 를 사용 하면 됩 니 다. 한 사람 당 하나의 권한 을 표시 하고 0 은 권한 이 없 음 을 표시 하 며 1 은 권한 이 있 음 을 표시 합 니 다.
    public class NewPermission {
    	//       ,    1 ,0   ,1   
    	public static final int ALLOW_SELECT = 1 << 0; // 0001
    
    	//       ,    2 ,0   ,1   
    	public static final int ALLOW_INSERT = 1 << 1; // 0010
    
    	//       ,    3 ,0   ,1   
    	public static final int ALLOW_UPDATE = 1 << 2; // 0100
    
    	//       ,    4 ,0   ,1   
    	public static final int ALLOW_DELETE = 1 << 3; // 1000
    
    	//          
    	private int flag;
    
    	/**
    	 *        
    	 */
    	public void setPermission(int permission) {
    		flag = permission;
    	}
    
    	/**
    	 *           
    	 */
    	public void enable(int permission) {
    		flag |= permission;
    	}
    
    	/**
    	 *           
    	 */
    	public void disable(int permission) {
    		flag &= ~permission;
    	}
    
    	/**
    	 *         
    	 */
    	public boolean isAllow(int permission) {
    		return (flag & permission) == permission;
    	}
    
    	/**
    	 *           
    	 */
    	public boolean isNotAllow(int permission) {
    		return (flag & permission) == 0;
    	}
    
    	/**
    	 *            
    	 */
    	public boolean isOnlyAllow(int permission) {
    		return flag == permission;
    	}
    }
    

    이상 코드 에 서 는 바 이 너 리 코드 마다 네 개의 상수 로 권한 항목 을 표시 합 니 다.ALLOWSELECT = 1 < 0 을 2 진법 으로 바 꾸 면 0001 이 고, 2 진법 1 위 는 Select 권한 을 표시 합 니 다.ALLOW_INSERT = 1 < 1 을 2 진법 으로 바 꾸 면 0010 이 고, 2 진법 2 위 는 Insert 권한 을 표시 합 니 다.private int flag 는 Permission 의 네 개의 boolean 형식의 변 수 를 대체 하 는 다양한 권한 의 사용 과 사용 정지 상 태 를 저장 합 니 다.flag 의 네 개의 바 이 너 리 로 네 가지 권한 의 상 태 를 표시 합 니 다. 한 사람의 0 과 1 은 하나의 권한 의 사용 과 사용 정 지 를 대표 합 니 다. 다음은 일부 상태 가 표시 하 는 권한 을 열거 합 니 다.
    flag
    삭제
    수정 하 다.
    새로 증가 하 다
    조회 하 다.
    1(0001)
    0
    0
    0
    1
    2(0010)
    0
    0
    1
    0
    4(0100)
    0
    1
    0
    0
    8(1000)
    1
    0
    0
    0
    3(0011)
    0
    0
    1
    1
    0(0000)
    0
    0
    0
    0
    15(1111)
    1
    1
    1
    1
    비트 마스크 를 사용 하 는 방식 은 0 보다 크 거나 같 거나 16 보다 작은 정수 만 사용 하면 모든 16 가지 권한 의 상 태 를 나 타 낼 수 있다.
    그 밖 에 권한 과 판단 권한 을 설정 하 는 방법 도 많 습 니 다. 예 를 들 어 위치 연산 을 사용 해 야 합 니 다. 예 를 들 어:
    public void enable(int permission) {
    	flag |= permission; //    flag = flag | permission;
    }
    

    이 방법 을 호출 하면 기 존의 권한 을 바탕 으로 하나 이상 의 권한 을 추가 할 수 있 습 니 다.
    업데이트 권한 추가:
    permission.enable(NewPermission.ALLOW_UPDATE);
    

    기 존 권한 이 Select, 즉 flag 가 0001 이 라 고 가정 합 니 다.상기 코드 를 실행 하면 flag = 0001 | 0100, 즉 0101 은 Select 와 Update 두 가지 권한 을 가 집 니 다.
    Insert, Update, Delete 세 가지 권한 추가:
    permission.enable(NewPermission.ALLOW_INSERT 
        | NewPermission.ALLOW_UPDATE | NewPermission.ALLOW_DELETE);
    

    NewPermission.ALLOW_INSERT | NewPermission.ALLOW_UPDATE | NewPermission.ALLOW_DELETE 연산 결 과 는 1110 입 니 다.기 존 권한 이 Select, 즉 flag 가 0001 이 라 고 가정 합 니 다.flag = 0001 | 1110, 즉 1111 은 이 네 가지 권한 을 가지 고 있 으 며, 세 가지 권한 을 추가 한 셈 이다.위의 설정 은 최초의 Permission 클래스 를 사용 하려 면 다음 세 줄 의 코드 가 필요 합 니 다.
    permission.setAllowInsert(true);
    permission.setAllowUpdate(true);
    permission.setAllowDelete(true);
    

    양자 대비 설정 은 Select 와 Insert 권한 만 허용 합 니 다.
    Permission
    permission.setAllowSelect(true);
    permission.setAllowInsert(true);
    permission.setAllowUpdate(false);
    permission.setAllowDelete(false);
    

    NewPermission
    permission.setPermission(NewPermission.ALLOW_SELECT | NewPermission.ALLOW_INSERT);
    

    Select 와 Insert, Update 권한 허용 여 부 를 판단 합 니 다.
    Permission
    if (permission.isAllowSelect() && permission.isAllowInsert() && permission.isAllowUpdate())
    

    NewPermission
    if (permission. isAllow (NewPermission.ALLOW_SELECT 
        | NewPermission.ALLOW_INSERT | NewPermission.ALLOW_UPDATE))  
    

    Select 와 Insert 권한 만 허용 하 는 지 판단 합 니 다.
    Permission
    if (permission.isAllowSelect() && permission.isAllowInsert() 
        && !permission.isAllowUpdate() && !permission.isAllowDelete())  
    

    NewPermission
    if (permission. isOnlyAllow (NewPermission.ALLOW_SELECT | NewPermission.ALLOW_INSERT))  
    

    이들 의 비 교 를 통 해 MyPermission 비트 마스크 방식 이 Permission 의 장점 에 비해 많은 코드 량 을 절약 할 수 있 고 비트 연산 은 바 텀 연산 이 며 효율 도 매우 높 으 며 이해 하기 도 간단 하 다 는 것 을 느 낄 수 있다.
    .
    비트 도 메 인 을 대체 할 수 있 는 더 좋 은 방안 은 라 는 책 에서 EnumSet 로 비트 도 메 인 을 대체 하 는 것 을 추천 합 니 다. 비트 도 메 인 표현 법 은 비트 조작 을 이용 하여 유 니 온 과 intesection 같은 집합 작업 을 효과적으로 수행 할 수 있 습 니 다.그러나 비트 필드 는 int 매 거 상수 의 모든 단점, 심지어 더 많다.비트 필드 가 숫자 로 인쇄 될 때 번역 비트 필드 는 번역 이 간단 한 int 매 거 진 상수 보다 훨씬 어렵 습 니 다.심지어 비트 필드 에 표 시 된 모든 요 소 를 옮 겨 다 니 는 것 도 쉬 운 방법 이 없다.
    public class Text {
        public static final int STYLE_BOLD          = 1 << 0;
        public static final int STYLE_ITALIC        = 1 << 1;
        public static final int STYLE_UNDERLINE     = 1 << 2;
        public static final int STYLE_STRIKETHROUGH = 1 << 3;
    
        public void applyStyles(int styles) {...}
    }
    

    호출:
    text.applyStyles(STYLE_BOLD | STYLE_ITALIC);  
    

    EnumSet 로 바 꾼 문법 은:
    public class Text {
    
        public enum Style {
            BOLD, ITALIC, UNDERLINE, STRIKETHROUGH
        }
    
        public void applyStyles(Set

    좋은 웹페이지 즐겨찾기