#define _CRT_SECURE_NO_WARNINGS 1 //求两个数二进制中不同位的个数 //要求:实现两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同 //例子:输入:1999 2299 输出:7 // //普通·版 //#include<stdio.h> //int main() //{ // int m = 22;//初始值即为输入值,可更改 // int n = 33; // int i = 0; // int count = 0; // for (i = 0; i < 32; i++) // { // if (((n >> i) & 1 )!= ((m >> i) & 1)) // { // count++; // } // } // printf("%d\n", count);//打印结果为5 // return 0; //} //进阶版 //m^n(异或),相同为0.相异为1 //#include<stdio.h> //int retu(int n) //{ // int count = 0; // int i = 0; // while (n) // { // n = n & (n - 1); // count++; // } // return count++; //} //int main() //{ // int m = 22; // int n = 33; // int count = 0; // int i = 0; // scanf("%d %d", &m, &n); // int ret = m ^ n;//相同为0,相异为1 // count=retu(ret); // printf("%d\n", count); // return 0; //} //打印整数的二进制的奇数和偶数位(获取一个整数二进制序列中所有的偶数位和奇数位,分别打印二进制序列) //#include<stdio.h> //int main() //{ // int n = 0; // scanf("%d", &n);//scanf("%d",&n),,,,,不能加\n // int i = 0; // //打印所有偶数位 // for (i = 31; i >= 1; i -= 2)//for循环,使每个符合条件的位(偶数位)打印 // { // printf("%d ", (n >> i) & 1 );//(n>>i)表示把最高位移动到最低位,然后与1按位与,打印结果 // } // printf("\n"); // //打印所有奇数位 // for (i = 30; i >= 0; i -= 2) // { // printf("%d ", (n >> i) & 1);//(n>>i)表示把最高位移动到最低位,然后与1按位与,打印结果 // } // return 0; //} //交换两个变量,不创建临时变量 //思路:a^b^b=a; (放在a里,就交换a,b) a^b^a=b;(放在a里,就交换a,b) //#include<stdio.h> //int main() //{ // int a = 0; // int b = 0; // scanf("%d %d", &a, &b); // a = a ^ b;//a放置的是a^b // b = a ^ b;//b=a^b=a^b^b=a,,,,b变成原来的a // a = a ^ b;//a=a^b^a=b,,,,a变为原来的b // printf("%d %d ", a, b); // return 0; //} //表达式求值先看是否存在整形提升或算术运算,再进行计算 //表达式真正计算时,先看相邻操作符的优先级决定先算谁 //相邻操作符的优先级相同的情况下,看操作符的结合性决定计算顺序 //即使有优先级和结合性,表达式的值依然可能不唯一//如int ret=(++i)+(++i)+(++i);计算顺序可能是++i ++i ++i 4+4 8+4 也可能是++i ++i 3+3 ++i 6+4 // //指针是变量,用来存放地址,指针变量中存的有效地址可以唯一指向内存中的一块区域 // 局部变量不初始化就是野指针,野指针不能被正常使用 //以下系统中,int类型占几个字节,指针占几个字节,操作系统可以使用的最大内存空间是多大 //32位下:4 4 2^32(每个字节有0,1....共32个字节) 64位下:4 8 2^64 //例题,求下面代码的值 #include<stdio.h> int main() { int arr[] = { 1,2,3,4,5 };//short型访问两个字节 short* p = (short*)arr;//把数组给了short型的指针,并把short型指针交给p int i = 0; for (i = 0; i < 4; i++) { *(p + i) = 0;//p是short型指针,p+0不跳过字节,是从01 00的0开始,p+1跳过2个字节 } //10进制:1 二进制:00000000000000000000000000000001 十六进制00 00 00 01 //把十六进制1-5各个数存在内存中(vs内是倒着存)小端存储为 //01 00 00 00(四个字节)02 00 00 0(四个字节)03 00 00 00(四个字节)04 00 00 00(四个字节) 05 00 00 00(四个字节) //第一次for循环,p+0不跳过字节,是从01 00的0开始,更改对象01 00,变为00 00(此时i++=1) //第二次for循环,p+1跳过二字节,是从00 00的0开始,更改对象00 00,变为00 00(此时i++=2) //第三次for循环,p+2跳过四字节,是从02 00的0开始,更改对象02 00,变为00 00(此时i++=3) //第四次for循环,p+3跳过六字节,是从00 00的0开始,更改对象00 00,变为00 00(此时i++=4,跳出循环) //一次改两个字节,改了4次,八个字节,两个整形,把1和2的空间全部改为0 for (i = 0; i < 5; i++) { printf("%d ", arr[i]);//以数组类型访问并打印,(4个字节) }//打印结果为0 0 3 4 5 //第二次for循环只是为了打印修改后的值 return 0; }