剑指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 #include10 #include 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< <
另外:将十进制数转换为‘A-Z’进制数(excel列的计数方式)
1 //============================================================================ 2 // Name : ExcelNum.cpp 3 // Author : Laughing_Lz 4 // Version : 5 // Copyright : All Right Reserved 6 // Description : 位运算 7 //============================================================================ 8 9 #include10 #include 11 using namespace std;12 /**13 *输入十进制整数,返回A-Z进制数14 */15 char ExcelNum(int n) {16 char result = 0;17 if (n <= 0) {18 cout<<"错误"< 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进制数为:"<