정수 하 나 를 2 진법 으로 바 꾼 후, 몇 개의 1 이 있 습 니까?

1030 단어 알고리즘
이전에 하나의 정수 가 2 인지 아 닌 지 를 판단 하 는 곱셈 (예 를 들 어 16 은 2 의 4 제곱) 을 보 았 다.성능 이 가능 한 한 높 아야 한다.
사고 1: int temp = 1 부터 매번 순환 비교 가 number 와 같 는 지, 같 지 않 으 면 temp 을 배로 증가 시 킵 니 다 (temp = temp * 2). 이렇게 순환 비교 하여 같 을 때 까지 합 니 다.
이 방법의 시간 복잡 도 는 O (LogN) 이다.
사고 2: 찾 는 것 은 2 의 곱셈 의 수, 규칙 이다.
            N        N-1
     2  ->  10b      1b
     4  ->  100b     11b
     8  ->  1000b    111b
     16 ->  10000b   1111b

최고 위 는 모두 1 이다.
그래서 N & (N - 1) = 0.시간 복잡 도 는 O (1) 이다.
그렇다면 정수 하 나 를 2 진법 으로 바 꾼 후 1 이 몇 개 있 습 니까?
물론 비트 연산 과 도 관련 이 있 을 것 이다.
하나의 숫자 N, N & 1 은 0 이거 나 1 이다.
그래서 결과 가 1 일 때 최 하위 가 1 이라는 뜻 이다.0 일 때 는 최 하위 가 1 이 아니 라 는 뜻 이다.
따라서 매번 & 후, 한 명 씩 오른쪽으로 이동 하고, 다시 &, N 오른쪽으로 0 으로 이동 할 때 까지 순환 을 끝 냅 니 다.
    NSInteger value = 111;
    NSInteger count = 0;
    while (value) {
        NSLog(@"%ld",value&1);
        int x = value&1;
        if (x == 1) count++;
        value = value>>1;
    }

좋은 웹페이지 즐겨찾기