当前位置: 首页 > news >正文

操作符详解上(非常详细)

目录

  • 二进制介绍
    • 二进制
    • 2进制转10进制
    • 10进制转2进制数字
    • 2进制转8进制和16进制
      • 2进制转8进制
      • 2进制转16进制
  • 原码、反码、补码
  • 移位操作符
    • 左移操作符
    • 右移操作符
  • 位操作符:&、|、^
  • 逗号表达式

二进制介绍

在初学计算机时我们常常会听到2进制、8进制、10进制、16进制…这些听着非常高级的词语,其实8进制、10进制、16进制几乎和2进制非常相似,只是稍微有一些不同,下面我们对这些进行较详细的介绍

二进制

我们举一个例子,比如用不同进制形式来表示数值15:

152进制:1111
158进制:17
1510进制:15
1516进制:F

我们还是先从熟悉的10进制开始讲解:
在我们学过的加减法中我们常常用这样的方式进行计算:
在这里插入图片描述
由于个位数字相加满10于是向十位数进1,而十位数也满十于是向百位数进1
因此我们从这里可以得知,所谓的十进制其实是满10进1,并且每位数字是不能超过10的
其实其他进制也相同,比如2进制
•2进制为满2进1
•2进制的数字每⼀位都是0~1的数字组成
所以1011就是15的二进制数了

2进制转10进制

10进制的123表示的值是⼀百二十三,为什么是这个值呢?其实10进制的每一位是权重的,10进制的数字从右向左是个位、十位、百位…,分别每一位的权重是10^0 , 10^1 , 10^2 …
如下图:
在这里插入图片描述
2进制和10进制是类似的,只不过2进制的每⼀位的权重,从右向左是:2^0 , 2^1 , 2 ^2…
如果是2进制的1101,该怎么理解呢?
在这里插入图片描述

10进制转2进制数字

方法如图:
在这里插入图片描述我们只需要对125不断的除2即可得到125在2进制中的数字(其实这里我还没有完全理解为什么这样就可以得出结果,所以后期如果我想通了会在这里加上自己的理解

2进制转8进制和16进制

2进制转8进制

8进制的数字每一位是0~ 7的,0~7的数字,各自写成2进制,最多有3个2进制位就足够了,比如7的二进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算⼀个8进制位,剩余不够3个2进制位的直接换算
如:2进制的01101011,换成8进制:0153,0开头的数组,会被当做8进制
在这里插入图片描述

2进制转16进制

16进制的数字每⼀位是0~ 9,a~ f(10~15 )的数字,各自写成2进制,最多有4个2进制位就足够了
比如f的二进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进制位会换算⼀个16进制位,剩余不够4个二进制位的直接换算
如:2进制的01101011,换成16进制:0x6b,16进制表示的时候前面加0x
在这里插入图片描述

原码、反码、补码

整数的2进制表示方法有三种,即原码、反码和补码
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位最高位的⼀位是被当做符号位,剩余的都是数值位。
正整数的原、反、补码都相同。
负整数的三种表示方法各不相同。
原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码

对于整形来说:数据存放内存中其实存放的是补码
因为在计算机系统中,数值⼀律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统⼀处理同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路

移位操作符

操作符号如下:
<<左移操作符
>>右移操作符
注:移位操作符的操作数只能是整数因为原码、反码、补码中提到的是整数的2进制,如果是小数的话不能表示)(但是我记得好像有小数表示的方法只不过不知道能不能用在这里,可能是我没搞清楚

左移操作符

在这里插入图片描述

右移操作符

移位规则:首先右移运算分两种:
1.逻辑右移:左边用0填充,右边丢弃
在这里插入图片描述

2.算术右移:左边用原该值的符号位填充,右边丢弃
在这里插入图片描述
特别提醒对于移位运算符,不要移动负数位,这个是标准未定义的(而且也没有必要这样)
比如:

int num = 10;
num>>-1;//error

位操作符:&、|、^

位操作符有:

1.& //按位与    对应位同时为“1”时才为“1”,否则为0
2.| //按位或    对应位只要有一个为1就为1
3.^ //按位异或   对应位相同为 0,不同为 1。
注:他们的操作数必须是整数

代码如下:

#include <stdio.h>
int main()
{int num1 = -3;int num2 = 5;num1 & num2;num1 | num2;num1 ^ num2;
return 0;
}

下面有⼀道面试题:
不能创建临时变量(第三个变量),实现两个数的交换
法一:

可能有很多人都会这样做
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a+b;
b = a-b;
a = a-b;
printf("a = %d b = %d\n", a, b);
return 0;
}

这种做法有一个缺陷,就是如果a+b过大就会导致出错,因为int有范围限制,所以这种方法也要分情况用
我们看看法二:

#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0;
}

这种方法就很难想到了,但是也有缺陷,就是如果是有负数的话,结果就会有问题,因此这方法仅适用于正数

例题:编写代码实现:求⼀个整数存储在内存中的二进制中1的个数:

//⽅法1
#include <stdio.h>
int main()
{
int num = 10;
int count= 0;//计数
while(num)
{
if(num%2 == 1)
count++;
num = num/2;
}
printf("⼆进制中1的个数 = %d\n", count);
return 0;
}
//⽅法2:
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
for(i=0; i<32; i++)
{
if( num & (1 << i) )
count++;
}
printf("⼆进制中1的个数 = %d\n",count);
return 0;
}
//⽅法3:
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while(num)
{
count++;
num = num&(num-1);
}
printf("⼆进制中1的个数 = %d\n",count);
return 0;
}

逗号表达式

逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。(如果左边表达式为假就不用执行右边的表达式了)

//代码1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
//代码2
if (a =b + 1, c=a / 2, d > 0)
while (a = get_val(), count_val(a), a>0)
{
..........
}

相关文章:

操作符详解上(非常详细)

目录 二进制介绍二进制2进制转10进制10进制转2进制数字2进制转8进制和16进制2进制转8进制2进制转16进制 原码、反码、补码移位操作符左移操作符右移操作符 位操作符&#xff1a;&、|、^逗号表达式 二进制介绍 在初学计算机时我们常常会听到2进制、8进制、10进制、16进制……...

React 高阶组件(HOC)

React 高阶组件(HOC) 高阶组件不是 React API 的一部分&#xff0c;而是一种用来复用组件逻辑而衍生出来的一种技术。 什么是高阶组件 高阶组件就是一个函数&#xff0c;且该函数接受一个组件作为参数&#xff0c;并返回一个新的组件。基本上&#xff0c;这是从 React 的组成…...

【NepCTF2023】复现

文章目录 【NepCTF2023】复现MISC与AI共舞的哈夫曼codesc语言获取环境变量 小叮弹钢琴陌生的语言你也喜欢三月七么Ez_BASIC_IImisc参考 WEBez_java_checkinPost Crad For You独步天下配置环境独步天下-镜花水月环境变量提权 独步天下-破除虚妄总结 独步天下-破除试炼_加冕成王知…...

大文件切片上传

创建组件&#xff1a;创建一个组件用于处理文件上传&#xff0c;命名为Upload.vue。 <template><div><input type"file" change"handleFileChange" /><button click"startUpload">开始上传</button></div> …...

ubuntu切换python版本

在没有安装类似anoconda的管理工具的时候&#xff0c;我们常常会被Ubuntu下的Python版本切换问题所头疼。 可以使用update-alternatives工具进行python版本的任意切换 当使用update-alternatives工具来切换Ubuntu系统上的Python版本时&#xff0c;您实际上是在系统范围内选择…...

docker 安装 elasticsearch、kibana 7.4.2

切换root 用户 su root 拉起镜像 docker pull elasticsearch:7.4.2 docker pull kibana:7.4.2 #1、创建Elasticsearch配置文件夹 mkdir -p /mydata/elasticsearch/config ​ #2、创建Elasticsearch数据文件夹 mkdir -p /mydata/elasticsearch/data #3、创建Elasticsearch插件…...

【es6】函数参数设置默认值

1、es6之前的函数参数默认值写法 1.1、使用短路或||的写法 当y为空时&#xff0c;y判断为false &#xff0c;走||右边的&#xff0c;所以y world;当y不为空时&#xff0c;y判断为true&#xff0c;不需要再运行||右边的&#xff0c;所以 y y function log(x, y) {y y || W…...

Pytest和Unittest测试框架的区别?

如何区分这两者&#xff0c;很简单unittest作为官方的测试框架&#xff0c;在测试方面更加基础&#xff0c;并且可以再次基础上进行二次开发&#xff0c;同时在用法上格式会更加复杂&#xff1b;而pytest框架作为第三方框架&#xff0c;方便的地方就在于使用更加灵活&#xff0…...

C#基础知识(一)

一、C#程序结构 《1》命名空间的声明&#xff08;namespace declaration&#xff09; 《2》一个class 《3》class方法 《4》class属性 《5》一个main方法 《6》语句&#xff08;statements&#xff09;&表达式&#xff08;Expressions&#xff09; 《7》注释 注&#xff1a…...

我还不知道?Android组件化插件化模块化

Android组件化、插件化和模块化是针对Android应用程序开发的一种架构设计思想和开发方式。 组件化&#xff08;Componentization&#xff09;&#xff1a; 组件化是将一个大型的Android应用程序拆分成多个独立的组件&#xff08;Module&#xff09;&#xff0c;每个组件可以独…...

借助 AI 工具,真的能成为 10x 工程师?

或许你听说过 10x 工程师吗&#xff1f; 如果你问猎头公司 10x 工程师是什么意思&#xff0c;他们可能会说 “生产力”&#xff01;10x 是指完成任务比别人快 10 倍的工程师。 2019 年&#xff0c;Twitter 上就曾经对 10 x 工程师这一议题有过一次空前热烈的讨论&#xff0c;引…...

TypeScript 面向对象

TypeScript 接口 TypeScript 接口定义如下&#xff1a; interface interface_name { } 以下实例中&#xff0c;我们定义了一个接口 IPerson&#xff0c;接着定义了一个变量 customer&#xff0c;它的类型是 IPerson。 customer 实现了接口 IPerson 的属性和方法。 interf…...

k8s 中快速启动curl pod 做api test

场景 k8s上运行的pod需要进行api测试,由于开发使用的镜像都是最小化构建,不能保证现有的pod中一定有curl工具,于是需要启动一个带有curl工具的测试pod专门进行api测试 指令 kubectl run curl-test-pod --imagecurlimages/curl -n {namespace} -i --tty -- sh上述指令实现在指…...

神经网络基础-神经网络补充概念-56-迁移学习

迁移学习&#xff08;Transfer Learning&#xff09;是一种机器学习技术&#xff0c;旨在将在一个任务上学到的知识或模型迁移到另一个相关任务上&#xff0c;以提高新任务的性能。迁移学习的核心思想是通过利用源领域&#xff08;source domain&#xff09;的知识来改善目标领…...

力扣:65. 有效数字(Python3)

题目&#xff1a; 有效数字&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 一个 小数 或者 整数&#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数 小数&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; &#xff08;…...

003-Spring boot 启动流程分析

目录 启动流程分析创建 SpringApplication启动 run(String... args) 读取配置流程分析listeners.environmentPrepared解析配置文件详细分析EnvironmentPostProcessor 详细分析 启动流程分析 SpringApplication.run(App.class, args);return new SpringApplication(primarySour…...

中间件的介绍

1.1 什么是中间件 中间件是介于应用系统和系统软件之间的一类软件&#xff0c;他使用系统软件所提供的基础服务&#xff0c;衔接网络上应用系统的各个部分或不同的应用&#xff0c;能够达到资源共享、功能共享的目的。 例如MySQL就可以看作是具备中间件特性的一种技术&#x…...

LVS-DR模式下(RS检测)ldirectord工具实现部分节点掉点后将请求发往正常设备进行处理

基于前文的LVS-DR集群构建环境 一.下载ldirectord软件 二.将模板文件中的LVS-DR模式相关文件拷贝到/etc/ha.d主配置目录并按实际设备修改 三.配置两台RS匹配规则 四.停止RS1的http服务进行测试 RS1失去工作能力&#xff0c;RS2接替RS1 基于前文的LVS-DR集群构建环境 一.下…...

c++游戏制作指南(四):c++实现数据的存储和读取(输入流fstream)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到静渊隐者的csdn博文&#xff0c;本文是c游戏制作指南的一部&#x1f35f; &#x1f355;更多文章请点击下方链接&#x1f355; &#x1f368; c游戏制作指南&#x1f3…...

如何使用CSS实现一个响应式视频播放器?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现响应式视频播放器⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣…...

告别Selenium!用DrissionPage的ChromiumPage和SessionPage,5分钟搞定登录与爬虫

告别Selenium&#xff01;用DrissionPage的ChromiumPage和SessionPage&#xff0c;5分钟搞定登录与爬虫 在Python自动化测试和爬虫开发领域&#xff0c;Selenium曾经是无可争议的王者。但随着时间的推移&#xff0c;开发者们逐渐意识到Selenium的局限性——复杂的配置、缓慢的执…...

Hitboxer终极指南:免费专业解决游戏按键冲突的SOCD重映射工具

Hitboxer终极指南&#xff1a;免费专业解决游戏按键冲突的SOCD重映射工具 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的格斗游戏中因为同时按下左右方向键而无法准确释放必杀技&#xff1f;或…...

LabVIEW多语言界面开发:基于JKI Simple Localization的控件本地化实战

1. 项目概述与核心思路 在开发面向全球用户的LabVIEW应用程序时&#xff0c;多语言界面支持是一个绕不开的刚需。想象一下&#xff0c;你的测控软件或工业自动化系统需要部署到不同国家&#xff0c;如果每次都要为不同语言单独开发一套界面&#xff0c;那工作量无疑是巨大的&am…...

npm publish前必看:如何用命令行优雅搞定2FA,避免发布包时卡壳

npm publish前必看&#xff1a;如何用命令行优雅搞定2FA&#xff0c;避免发布包时卡壳 在npm生态中&#xff0c;发布包是开发者日常工作中不可或缺的一环。然而&#xff0c;随着安全要求的提高&#xff0c;双因素身份验证&#xff08;2FA&#xff09;已成为保护账户安全的重要措…...

HPM6750 RISC-V高性能MCU开发实战:从双核应用到图形加速

1. 项目概述与核心价值最近几年&#xff0c;RISC-V架构在嵌入式领域的声量越来越大&#xff0c;从最初的学术研究到如今在工业控制、边缘计算等场景的落地&#xff0c;生态的成熟度肉眼可见。作为一名长期混迹在嵌入式开发一线的工程师&#xff0c;我对于新架构、新平台总是抱有…...

DPDK l2fwd性能调优手记:Hygon 8核+Intel X710网卡,从20G到满速的配置清单

DPDK l2fwd性能调优实战&#xff1a;Hygon 8核X710网卡突破10G瓶颈全记录 当我们在Hygon C86 3250八核处理器与Intel X710 10GbE网卡的硬件组合上部署DPDK l2fwd应用时&#xff0c;初始测试仅达到20Gbps的转发性能&#xff0c;远未达到硬件理论带宽。经过系统级的深度调优&…...

告别触摸漂移!手把手教你为ESP32和XPT2046电阻屏制作LVGL校准工具

ESP32电阻屏精准触控实战&#xff1a;从硬件校准到LVGL交互优化 电阻式触摸屏在嵌入式设备中广泛应用&#xff0c;但精度问题一直困扰着开发者。当你在ESP32上连接XPT2046触摸控制器时&#xff0c;是否遇到过点击位置漂移、响应不准确的烦恼&#xff1f;本文将带你深入解决这一…...

CVBS转BT656/BT601,能成熟、应用广泛的低功耗视频解码器

GM7150是一款低功耗、9位NTSC/PAL视频解码器&#xff0c;由成都振芯科技股份有限公司生产。该芯片采用CMOS工艺&#xff0c;通过IC总线与PC或DSP相连构成应用系统。它内部包含1个模拟处理通道&#xff0c;能实现CVBS、S-Video视频信号源选择、A/D转换、自动钳位、自动增益控制(…...

LRC Maker终极指南:3分钟学会制作专业滚动歌词的免费神器

LRC Maker终极指南&#xff1a;3分钟学会制作专业滚动歌词的免费神器 【免费下载链接】lrc-maker 歌词滚动姬&#xff5c;可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 还在为歌词与音乐不同步而烦恼吗&#xff1f;想…...

从 SAP Easy Access Menu 到 FLP 一体化入口:重新理解经典事务在 SAP Fiori 中的价值

在很多企业的数字化项目里,SAP Fiori 往往被理解为一套全新的体验层,而 SAP GUI 则被视为必须逐步替换掉的传统界面。这个判断只说对了一半。真正成熟的 Fiori 落地,不是把旧世界一刀切掉,而是让新旧能力在同一个入口里顺滑协作。SAP Easy Access Menu 的意义,恰恰就在这里…...