重温c语言之,7天开整,就是随便的写写,第十天
一:操作符
&:按位与----2进制
|:按位或----2进制
^:按位异或----2进制
~:按位取反---2进制
&:先上代码,然后解释
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 int main() 5 { 6 int a = 3; 7 int b = -5; 8 int c = a & b; 9 printf("%d\n", c); 10 return 0; 11 }
这里的结果是:3
为什么呢,a=5,是正数,所以原码,反码,补码都是一样的,---->00000000000000000000000000000011
b=-5,是负数,先写原码,首位是1,因为负数是1, ---->10000000000000000000000000000101
再写反码, ---->11111111111111111111111111111010
最后再写补码 ---->11111111111111111111111111111011
因为机器上面,运算都是用补码来进行的,所以用a=5与b=-5的补码进行&运算,(&运算:全1得1,有0则0),所以:
00000000000000000000000000000011,最后再换算成为:原码,因为开头的地方是0,所以这个是正数,原码,反码,补码都是一样的,
%d这个打印的是一个有符号的整数,所以最终的结果是:3
|:先上代码,然后解释
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 5 int main() 6 { 7 int a = 3; 8 int b = -5; 9 int c = a | b; 10 printf("%d\n", c); 11 return 0; 12 }
这里的结果是:-5
先写上a的补码:00000000000000000000000000000011
再写上b的补码:11111111111111111111111111111011
|:(|运算:全0得0,有1则1),所以:11111111111111111111111111111011
因为答案求原码,所以:先有补码转换成反码:11111111111111111111111111111010
最后再转化成原码:10000000000000000000000000000101
%d这个打印的是一个有符号的整数,所以最终的结果是:-5
^:先上代码,然后解释
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 5 int main() 6 { 7 int a = 3; 8 int b = -5; 9 int c = a ^ b; 10 printf("%d\n", c); 11 return 0; 12 }
这里的结果是:-8
先写上a的补码:00000000000000000000000000000011
再写上b的补码:11111111111111111111111111111011
^:(^运算:相同为0,相异位1),所以:11111111111111111111111111111000
因为答案求原码,所以:先有补码转换成反码:11111111111111111111111111110111
最后再转化成原码:10000000000000000000000000001000
%d这个打印的是一个有符号的整数,所以最终的结果是:-8
再将异或的操作,5^5=0;00-------101^00-------101=00-------000,--->这里就可以得出结论:a^a=0
5^0=0;00-------101^00-------000=00-------101,--->这里就可以得出结论:a^0=a
2^5^2=5;
2:00000000000000000000000000000010
5:00000000000000000000000000000101
2^5=00000000000000000000000000000111
2^5^2=00000000000000000000000000000101
故由上述运算流程可以得知,异或操作支持交换律
所以完全可以得知,2^5^2=2^2^5=5
二:小程序题
不能创建临时变量(第三个变量),实现两个数的交换
先写一个可以创建临时变量的,直接上代码
1 #include<stdio.h> 2 3 void swap(int* n1,int* n2) 4 { 5 int num=*n1; 6 *n1=*n2; 7 *n2=num; 8 } 9 int main() 10 { 11 int n1=0; 12 int n2=0; 13 scanf("%d %d",&n1,&n2); 14 swap(&n1,&n2); 15 printf("%d %d\n",n1,n2); 16 return 0; 17 }
这里就是直接利用临时变量来进行两个数的交换的
而题目要求是不能创建临时变量,所以先上第一个有点问题的代码
1 #include<stdio.h> 2 void swap(int* n1,int* n2) 3 { 4 *n1=*n1+*n2; 5 *n2=*n1-*n2; 6 *n1=*n1-*n2; 7 } 8 int main() 9 { 10 int n1=0,n2=0; 11 scanf("%d %d",&n1,&n2); 12 swap(&n1,&n2); 13 printf("%d %d\n",n1,n2); 14 }
这里的小问题就是:n1,n2这两个变量是Int类型的,是存在最大值的,所以会出现溢出的情况,所以在这里会出现小问题,故有第二个改进方法
直接上代码
1 #include<stdio.h> 2 void swap(int* n1,int* n2) 3 { 4 *n1=*n1^*n2; 5 *n2=*n1^*n2; 6 *n1=*n1^*n2; 7 } 8 int main() 9 { 10 int n1=0,n2=0; 11 scanf("%d %d",&n1,&n2); 12 swap(&n1,&n2); 13 printf("%d %d\n",n1,n2); 14 }
这里就不存在溢出的问题,这里直接利用操作符异或(^),相同则0,相异为1,来直接进行操作
但这里还有一个限定条件:只是适用于整形,不能用在浮点型