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 }*/
—————————————————————————————————————行走在人猿的并行线——Laughing_Lz