首页 > 其他分享 >重温c语言之,7天开整,就是随便的写写,第十天

重温c语言之,7天开整,就是随便的写写,第十天

时间:2024-11-11 19:40:50浏览次数:3  
标签:---- 第十天 int 补码 写写 n1 天开 n2 原码

一:操作符

  &:按位与----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,来直接进行操作

  但这里还有一个限定条件:只是适用于整形,不能用在浮点型

 

标签:----,第十天,int,补码,写写,n1,天开,n2,原码
From: https://www.cnblogs.com/xiejinghao/p/18539174

相关文章

  • 代码随想录算法训练营第十天 | 232.用栈实现队列+225. 用队列实现栈+20. 有效的括号+1
    加入训练营有点晚,没跟上任务就开始有些偷懒没有真的认真开始,从第十天开始下决心认真完成每天任务还有博客记录学习过程。栈与队列理论基础首先是学习了栈和队列的理论基础,队列 先进先出,栈 先进后出。栈 以底层容器完成其所有的工作,且对外接口统一,有.push,.pop等,不提供......
  • 重温c语言之,7天开整,就是随便的写写,第九天
    这次照着网站上的内容,写了一个简单的小游戏,3字棋,其实也可以n字棋附上代码,这里是:game.h1#pragmaonce2#include<stdio.h>3#include<stdlib.h>4#include<time.h>56//游戏代码的声明(函数声明,符号定义)78#defineRow39#defineCol31011//初始化棋......
  • 重温c语言之,7天开整,就是随便的写写,第八天
    一:函数1、递归题目:求n的阶乘(不考虑溢出)上代码1#include<stdio.h>2intfactorial(intn){3if(n>1){4returnn*(factorial(n-1));5}6else7{8return1;9}10}11#include<stdio.h>12in......
  • 重温c语言之,7天开整,就是随便的写写,第七天
    一:素数又见素数但这次不一样,这次需要用到函数,利用函数来将素数区分出来,直接上代码1#include<stdio.h>2#include<math.h>3intprime_num(intnum)4{5for(inti=2;i<sqrt(num);i++)6{7if(num%i==0)8{9......
  • 重温c语言之,7天开整,就是随便的写写,第六天
    一:字符串相比较题目:编写代码实现,模拟用户登录情景,并且只能登录3次。(只允许输入3次密码,密码正确则提示输入成功,如果三次都输入错误,则退出程序)这里就是用到了strcmp这个函数,其实这个函数是让两个字符串同时从左到右转换成ASCLL码,之后两个字符,前面的减去后面的,如果全部减......
  • 第十天(实训学习整理资料(九)版本控制Git)
    目录一、安装配置1、下载地址2、初始配置二、初始化本地仓库1、版本库2、初始化本地仓库3、本地仓库的构成三、版本管理1、提交新文件2、修改文件3、查看历史版本4、版本回滚5、代码撤销6、删除文件四、远程仓库1、定义2、远程仓库分类3、注册并新建远程仓库......
  • 重温c语言之,7天开整,就是随便的写写,第五天
    一:库函数---printf()这个函数printf()的返回值是int,这个函数竟然有返回值,值的多少是取决于输出的内容有多少个字符二:循环1、for循环这个循环中,如果判断的地方省略的话,这个循环就是永远成立(恒成立),1for(;;)这样的话,就会无线循环下去--------(弊端1)......
  • 重温c语言之,7天开整,就是随便的写写,第三天+第四天版
    一:指针1、关于指针的含义---粗略例如:inta=10;int*p=&a;这里的*,是说明p是指针变量,int说明p是指向的对象是int类型的*p=20,这里的*是解引用符,意思是通过p中存放的地址,找到p所指向的对象,*p就是p指向的对象2、关于指针的大小......
  • 代码随想录算法训练营第十天|leetcode232.用栈实现队列、leetcode225. 用队列实现栈、
    1leetcode232.用栈实现队列题目链接:232.用栈实现队列-力扣(LeetCode)文章链接:代码随想录视频链接:栈的基本操作!|LeetCode:232.用栈实现队列哔哩哔哩bilibili自己的思路:真的第一次接触这个概念,完全没有任何思路,甚至不知道从何下手1.1基本概念栈就是相当于砌墙的砖头,先......
  • 重温c语言之,7天开整,就是随便的写写,第二天
    一:操作符除法:如果都是整数,除数,被除数都是整数,那么结果:就是整数的商(没有小数部分的),例如:7/2=3;如果除数或者被除数其中一个是浮点数,那么结果就是(条件是:能除尽的,并且小数在基础数据类型包含下的)完整的商(包含小数部分的):例如:7/2.0=3.500000;如果想要在pr......