자바 비트 연산 의 기초 및 사용 (의미)
18503 단어 자바
요 며칠 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
한 시스템 에서 사용 자 는 일반적으로 조회 (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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.