JZ-C-10

剑指offer第十题:位运算,判断二进制中1的个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//============================================================================
// Name        : JZ-C-10.cpp
// Author      : Laughing_Lz
// Version     :
// Copyright   : All Right Reserved
// Description : 位运算
//============================================================================
 
#include <iostream>
#include <stack>
using namespace std;
/**
 *位运算:
 */
int Number(int n) {
    int count = 0;
    while (n > 0) {
        if (n & 1) { //和1(...01)相与运算,保证除最低位均为0,若最低位为1,则与运算结果为1,否则为0 ★★
            count++;
        }
        n = n >> 1; //将要判断的数右移一位(有可能出现死循环,如0X80000000 为负数,后移一位为0XC0000000(负数右移左端补1),最后变成0XFFFFFFFF,死循环···★★)
    }
    return count;
}
int Number1(int n) {
    int count = 0;
    int flag = 1;
    int time = 0;
    while (flag) {
        cout << "第" << ++time << "次" << endl;
        if (flag & n) {
            count++;
        }
        flag = flag << 1; //将flag左移,避免死循环。32位整数需要移位32次★★
    }
    return count;
}
int Number2(int n) {
    int count = 0;
    while (n) {
        ++count;
        n = n & (n - 1);// n-1:将从低至高位第一个1变为0,同时从低至高位第一个1后的所有0变为了1,n&(n-1):将从低至高的第一个1及其后面的数全部变为0 循环即可★★
    }
    return count;
}
int main() {
//    cout << Number(0x80000000) << endl; //前面带0 表示八进制,前面带0x 表示十六进制
//    cout << Number1(10) << endl; //前面带0 表示八进制,前面带0x 表示十六进制
    cout<<Number2(12)<<endl;//最优
    return 0;
}

另外:将十进制数转换为‘A-Z’进制数(excel列的计数方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//============================================================================
// Name        : ExcelNum.cpp
// Author      : Laughing_Lz
// Version     :
// Copyright   : All Right Reserved
// Description : 位运算
//============================================================================
 
#include <iostream>
#include <stack>
using namespace std;
/**
 *输入十进制整数,返回A-Z进制数
 */
char ExcelNum(int n) {
    char result = 0;
    if (n <= 0) {
        cout<<"错误"<<endl;
        return -1; //错误
    } else {
        std::stack<char> s;
        while (n > 0) {
            int remain = n % 26;
            remain == 0?remain = 26,n = n-1:NULL;
            result = remain + 64;
            n = n / 26;
            s.push(result);
        }
        cout<<"A-Z进制数为:"<<endl;
        while(!s.empty()){
            cout<<s.top();
            s.pop();
        }
    }
 
    return result;
}
 
/*int main() {
    ExcelNum(27);
    return 0;
}*/

发表评论

电子邮件地址不会被公开。 必填项已用*标注