#include <stdio.h> // 引入标准输入输出库,用于scanf和printf等函数 // 函数功能:计算n的二进制表示中1的个数 // 参数:long long类型的n,表示要计算的数 // 返回值:n的二进制中1的个数 long long hanshu1(long long n) { long long count = 0; // 定义计数器,初始化为0 while (n) // 当n不为0时循环(处理完所有二进制位后n会变为0) { count += n & 1; // n&1获取n的最低位,如果是1则计数器加1 n >>= 1; // n右移一位,处理下一个二进制位 } return count; // 返回1的个数 } // 函数功能:计算2的b次方(当b为非负整数时) // 参数:long long类型的b,表示指数 // 返回值:2^b的结果 long long hanshu2(long long b) { long long c = 1; // 初始值为1(2^0 = 1) while (b--) // 循环b次,每次循环后b减1 { c <<= 1; // 左移1位,相当于乘以2 } return c; // 返回2^b的结果 } int main() { long long t, n; // 定义变量t(测试用例数量)和n(输入的数) scanf("%lld", &t); // 读取测试用例数量t(使用%lld匹配long long类型) while (t--) // 循环处理t个测试用例,每次循环后t减1 { scanf("%lld", &n); // 读取当前测试用例的n值 if (n != 0) // 如果n不等于0 { long long a = 0, b = 0; // 定义a和b,初始化为0 a = hanshu1(n); // 计算n的二进制中1的个数,赋值给a // 计算2^a - 1,即二进制表示为a个1的数 // 这通常用于表示值a第一次出现的位置 b = hanshu2(a) - 1; // 输出a和b,使用%lld匹配long long类型 printf("%lld %lld\n", a, b); } else // 如果n等于0 { // 这里存在格式不匹配问题: // 0虽然可以用%d输出,但为了统一应该使用%lld printf("%d %d\n",0,0); } } return 0; // 程序正常结束 }