검 지 offer:이 진 중 1 의 개수(비트 연산)
정 수 를 입력 하고 이 32 비트 바 이 너 리 는 1 의 개 수 를 출력 합 니 다.그 중 음 수 는 부호 로 표시 한다.tip:양수 패 치 는 원 코드 이 고 음수 의 패 치 는 양수 패 치-1 반)
예시
입력:11 출력:3 해석:입력 한 11,바 이 너 리 는 00000000000000000000000001011 로 모두 세 자리 가'1'입 니 다.
코드
해법
자바 API 함수 사용
1.bitCount
public class Solution {
public int NumberOf1(int n) {
return Integer.bitCount(n);
}
}
2.toBinaryString
public class Solution {
public int NumberOf1(int n) {
String s = Integer.toBinaryString(n);
int count = 0;
for(int i=0;i<s.length();i++){
if(s.charAt(i) == '1'){
count++;
}
}
return count;
}
}
해법
비트 연산
1.마스크
우 리 는 숫자의 32 자 리 를 두루 훑 어 보 았 다.만약 한 사람 이 11 이 라면,계수 기 를 하나 더 넣 어 라.우 리 는 비트 마스크 를 사용 하여 숫자의 i 위 를 검사 합 니 다.처음에 마스크 m=1 은 1 의 바 이 너 리 가 0000 0000 0000 0000 00001 이 라 고 표시 하기 때문에 모든 숫자 와 마스크 11 이 논리 적 이 고 연산 을 하면 우 리 는 이 숫자의 가장 낮은 위 치 를 얻 을 수 있다.다음 위 치 를 검사 할 때,우 리 는 마스크 를 왼쪽으로 한 명 옮 길 것 이다.0000 0000 0000 0000 0000 0010 이 과정 을 반복 합 니 다.
public class Solution {
public int NumberOf1(int n) {
int count = 0;
int mask = 1;
for(int i=0;i<32;i++){
if((n & mask) != 0){
count++;
}
mask = mask << 1;
}
return count;
}
}
2.비트 조작
만약 하나의 정수 가 0 이 아니라면,이 정 수 는 적어도 한 명 은 1 이다.만약 우리 가 이 정 수 를 1 로 줄 이면 원래 정수 맨 오른쪽 에 있 던 1 은 0 으로 변 하고 원래 1 뒤에 있 던 모든 0 은 1 로 변 한다(맨 오른쪽 에 있 는 1 뒤에 0 이 있다 면).나머지 모든 분 들 은 영향 을 받 지 않 을 겁 니 다.예 를 들 어 하나의 이 진수 1100,오른쪽 부터 세 번 째 는 가장 오른쪽 에 있 는 1 이다.1 을 뺀 후 3 위 는 0 이 되 었 고,그 뒤의 두 분 은 0 이 1 이 되 었 으 며,앞의 1 은 변 하지 않 았 기 때문에 얻 은 결 과 는 1011 이 었 다.우 리 는 1 을 뺀 결 과 는 맨 오른쪽 에 있 는 1 을 시작 한 모든 사람 을 반대로 한 것 을 발견 했다.이때 우리 가 원래 의 정수 와 1 을 뺀 후의 결 과 를 다시 연산 하면 원래 의 정수 오른쪽 에 있 는 1 명 부터 모든 자리 가 0 이 된다.예 를 들 어 1100&1011=1000.즉,하나의 정 수 를 1 로 줄 이 고 원래 의 정수 와 연산 을 하면 이 정수 의 맨 오른쪽 에 있 는 1 을 0 으로 바 꾸 는 것 이다.그러면 하나의 정수 의 이 진 은 몇 개의 1 이 있 으 면 몇 번 이나 이런 조작 을 할 수 있다.
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n != 0){
n = n & (n-1);
count++;
}
return count;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 문자열 입력으로 모든 유효한 IP 주소 생성(LeetCode 93번 문제)이 문제의 공식 난이도는 Medium으로 좋아요 1296, 반대 505, 통과율 35.4%를 눌렀다.각 항목의 지표로 말하자면 보기에는 약간 규범에 맞는 것 같지만, 실제로도 확실히 그렇다.이 문제의 해법과 의도는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.