主要考虑效率. 思路有两个: 2的幂,2^0,2^1,2^2...即是1,2,4,8,16... 二进制表示中,1,10,100,1000,.. 于是,思路一: 最直观的,使用1进行移位操作:判断是不是等于这个数. int i=1; int n m; cinn m; while(in m) { i=1; if(i==n m) co t"the n mber is 2 s power." break; } if(in m) co t"the n mber is not 2 s power". 思路二: 进一步思考 2的幂减1,值为0,1,3,7,15...二进制0,1,11,111,1111.. 与2的幂1,2,4,8,16...,二进制1,10,100,1000..其和是1,11,111,1111..为2*n-1 于是可以这么写: (n m|n m-1 == 2*n m-1)?