#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //int main() //{ // int a, b, c; // a = 5; // c = ++a; // b = ++c, c++, ++a, a++; // b += a++ + c; // printf("a=%d b=%d c=%d\n");//a=9,b=23,c=8 // return 0; //} //&是按位与 &&是逻辑与 ||是逻辑或 !是逻辑取反 //统计二进制中1的个数,,,写一个函数,返回参数二进制中1的个数 //比如15 0000 1111 4个1 //int retu(int n) 15为00001111 15%2=1,需要计数count++,15/2=7,7为0000111(去掉最后的1)7%2=1,计数count++,7/2=3,3为00000011(去掉最后的1)... 计数%2=1时,需要循环,并用count++ //{ // int count = 0; // while (n) // { // if (n % 2 == 1)//只考虑正数,没考虑负数 ---可以直接将int retu (int n) 改为int retu(unsigned int n),但是还是没从根本上解决问题 // { // count++; // } // n /= 2; // } // return count; //} //int main() //{ // int n = 15; // int ret=retu(n); // printf("ret=%d\n", ret); // return 0; //} //进阶版(法2) //如果已知一个数字的二进制是几,想知道某一个位置的数组是0还是1,只需要只要直接将这个位置和00000000000000000000000000000001按位与即可----- //如1111111111111111111111111111111111111111 // 0000000000000000000000000000000000000001最后一位按位与 // 0000000000000000000000000000000000000001结果为1 //int retu(int n) //{ // int count = 0; // int i = 0; // for (i = 0; i < 32; i++)//目的:使每次判断某一位n%1==1之后,向右移动一个 // { // if ((n >> i) &1 == 1)//if (n & 1 == 1)判断该二进制的某一位是否为1 &为按位与 // { // count++;//是1就计数,一次1 // } // } // return count; //} //int main() //{ // int n = -1; // int ret = retu(n); // printf("ret=%d\n", ret); // return 0; //} //再次进阶版(法3) // int retu(int n) //{ // int count = 0; // int i = 0; // while (n)//原为while(n!=0),!=0可以省略 //循环,如果用if语句,无法循环 // { // n=n & (n - 1) ; // //n&(n-1)!=0就说明最终结果不是00000000000000000000000000000000,某一个二进制某一位有1,可以继续去掉1,每次去掉1都用count++ // count++; // } // return count; //} //int main() //{ // int n = -1; // int ret = retu(n); // printf("ret=%d\n", ret); // return 0; //} //n=n&(n-1)--------n与n-1按位与会让二进制序列最右面的1去掉!!!!!!!!!!!!!!!!!! //实例:n=15 //1111 - n //1110 - n-1(按位与操作) //1110 - n(新的n)(比p72的n少了1个1) //1101 - n-1(按位与操作) //1100 - n(新的n)(比p74的n少了1个1) //1011 - n-1(按位与操作) //1000 - n(新的n)(比p76的n少了1个1) //0111 - n-1(按位与操作) //0000 - n(新的n)(比p78的n少了1个1) //例题 写一个代码判断一个数字是不是2的n次方 //2的n次方的数字的二进制,只有一个1 //k&(k-1)==0; #include<stdlib.h> void retu(int n) { if((n & (n - 1))== 0)//原为while(n!=0),!=0可以省略 //循环,如果用if语句,无法循环 printf("%d\n是n的2次方"); //n&(n-1)!=0就说明最终结果不是00000000000000000000000000000000,某一个二进制某一位有1,可以继续去掉1,每次去掉1都用count++ else printf("%d\n不是n的2次方"); } int main() { int n = -1; scanf("%d", &n); retu(n); return 0; }