JZ-C-10

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

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

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

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