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

c语言操作符详解

 操作符详解

20df79a3aa584d458f41f61cd4fd01f3.png

59ccb1cafc44467090cbee4f0923881d.png

 1f9a8984a35849f7980572a5a7ee82d5.png

正数的原码反码补码相同

负数的原码最高位数是1,正数为0

 整数在内存中存储的是补码

ae916ba8b29b4805a5182aaa105c963b.png

负数的左移与右移,移的是补码,打印的是源码

补码-1取反就是原码。

左移有乘2的效果

22f45f0ad5d94130b0b112354ed389ce.png

左移和右移只针对整数。

vs里的右移操作赋采用的是算数右移,右边丢弃、左边补原符号位

符号位是根据正数还是负数来确定的,正数补0,负数补1.

657de460d8084c82a55f82dcaa8fb389.png

5d85f96f4a70465faa54f36d6000ab0e.png

总结:

计算的是以补码形式计算,打印的是以原码形式存在。

be7d6b6419ed43fb8ebdd09799e03fb8.png

cefaf8bc27a343c68243351d1bbb30fa.png

 计算的时候要用补码,因为整数在内存中存储的是补码。

按位与二个同时为1就得1,有一个不得1就为0.

9b0ce62655884c28bc695265ffb95a09.png

 取反的时候不要动符号位。

异或是相同为0,相异为1

e559e28e2129405abbf7b92c2ae88be1.png

1b312297a1de4e1fa6b9da33cd50f237.png

8d9d15b356c849f6bc389cc6cb264e46.png

0异或a是a  a异或a是0 

异或支持交换律

5167124baa004afa948ed23cedfb0153.png

统计二进制中有多少个1

96f47f4f881941e7b12b0f53a14caad9.png

任何一个数a按位与1如果==1就说明a的二进制最低是1

a&1==0 说明a的二进制最低位是0

c4a59502c50e4c1daba0bd08f226ad17.png

就比如这段二进制代码 a&1 第1位是0 就&1 得0 就跳过最低位,看第二位,如果第二位&1等于1就让COUNT++,一直循环下去。这样就可以知道这段二进制代码有多少个1了。

方法1 利用&和>>操作符计算出二进制代码有多少个1.

98906b083a2942ec8a1e26a350a1446c.png

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int i = 0;int a = 0;while (~scanf("%d", &a)){int count = 0;for (i = 0; i < 32; i++){if ((a >> i) & 1 == 1){count++;}}printf("%d\n", count);}	return 0;
} 

46313fdf5f6d400692b37499f76a3e13.png

总结
把一个二进制向右移动i个位移到最低位和1进行按位与进行比,如果==1就说明二进制有1 

从右往左看,每次移到的位位数再增加,最高是32位

方法2:利用/2  %2的方法来

bf4d544d04d54c2bbc6551abe6f6f731.png

ee72854b22c845ad99a859e5a4f285ec.png

想得到二进制的每一位 /2  %2来解决这个问题

eeb6c6d905b2468eaa43cf6293695e0c.png

//考虑正负数问题
int count_one_bit(unsigned int n)
{int count = 0;while (n){if ((n % 2) == 1){count++;}n /= 2;}return count;
}
int main()
{int n = 0;scanf("%d", &n);int ret=count_one_bit(n);printf("%d\n", ret);return 0;
}

方法3

利用n=n&(n-1)来达到把n的二进制最右边的1去掉

比如n=-1

1111 n

1110 n-1

1110 n

1101 n-1

1100 n

1011 n-1

1000 n

0111 n-1

0000 n

利用这种效果来实现二进制代码有多少个1

55903e705f8043d5afa31cd007c5b020.png

//判断一个数是否是2的次方数

2ebdcb2770d9419d994cd8e0276ef4dd.png

//判断一个数的是否是2的次方数
//n=n&(n-1)
// 0001
//0010
//0100
//1000
int main()
{int n = 0;scanf("%d", &n);if ((n & (n - 1)) == 0){printf("YES\n");}else{printf("NO\n");}return 0;
}

练习2          二进制位 置0或者置 1 

编写代码将13⼆进制序列的第5位修改为1,然后再改回0?

4e47685dd455409c8a9fe9ce79ad90e1.png

443b91284ab4404e9bc65f924db53f9b.png

//编写代码将13⼆进制序列的第5位修改为1,然后再改回0 ?
// 0001 1101
int main()
{int n = 0;scanf("%d", &n);	// 13  0000 1101 //移到n = n | (1 << 4);  // 0000 1101 | 0001 0000==0001 1101printf("%d\n", n);//复原
//   0001 1101 变成 0000 1101
//   按位与1110 1111 即可   怎么变呢  1的二进制是  0000 0001 左移4位 0001 0000然后取反 1110 1111n = n & ~(1 << 4);printf("%d\n", n);return 0;
}

获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

3412eade4862443d9465e5b2e53c2125.png

总结方法:

输入的数只要往右移,把每一个数移到最低位按位与上一个1就可以获得最低的是否是1了,可以明确判断出你输入的数转换成二进制形式有多少个1.

编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同

6397adc8ead54802afced720dc7c2a06.png

0321b6d5f2c34d429764119352c0bcfc.png

10ccecb5a11b4499a63e440e2aa244e5.png

795c1ddb117d43e6a445672d2a2b40a2.png

语法说说支持连续赋值,建议写代码不要这么写。

354688d9e71745e5bbdfe067b7fa12fc.png

53b9e24fc0704b70881bec1a2aef4284.png

96ca1e12b07046a08772322659a89cb5.png

c81495572a44425f89589b854646bc97.png

效果一样。 

强制类型转换。 

f72b86df9f934a7ca69681a1a709cd98.png

7c77415756154d7db08374f96e4bffe0.png

afa731b646854ef0bc808101208aafdf.png

 1是40 2是4/8,3是10,4是4/8

b0257a30324948599e7c25449a0512a0.png

23cbcf305d7f47c294b43831de6b2264.png

逻辑与,左边为假右边就不计算了。

逻辑或,左边为真,右边就不计算了

 0428c84ddcc940ad896e42f1e5a87625.png

逗号表达式是从左到右计算,整个表达式的结果是最后一个表达式的结果。

237dc5030fa34438b0b3e2e51fa8cb22.png

99735537754a49b5bfb6a27c2c83e155.png

 50a22fc78f0d430bbb57a1289a77ddf9.png

b7767d114f4e469788162019df18ae4b.png

edba08ff4104420ab324d7fecd9ba2ac.png

5ac4a07cf140431387b1c46815667539.png

整型提升

b5f9e9c5d7854700a0cf2da7bd61e0a9.png

61256e0a4dc544889cc0b99ba0326d66.png

 d67e20c0c212487e8348debaf7e80abb.pngd3a790ba9ace421d840ad465a36e8a3a.png

20039b6e649a4e5aa4e4082e942ab1ee.png

一个char类型的占1个bit 相对于8个biye位,他要整型提升是因为    难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)
。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。

例如图中的a为5,b为126  先把a的原码写出来相加得出来后8位,首先看最高位是0或者1,是1补1,是0补0,得出来的是补码,因为整数在内存中的存储是补码形式的,然后-1取反得原码,因为打印的都是以原码形式打印的。

a与b会发生整形提升,a与b的值会发生变化。

f8be04e04df044dd9e0fd7a4f2a709a5.png

无符号的数发生整形提升,高位补0

55b1bba5aa7345cfb685333279cc59f4.png

上面的这些大小都小于int类型

下面讨论大小大于或者等于int类型的整形提升

31786e7b602545569db9c4d96149ed1a.png

这些类型都是向上转换的。

91ac16415dbf4a92aa7e140464a5898b.png

数据存储

72dadfe03e46428984b4b1771153d8f4.png

01b15cdb50ce411fa3a09a96ab239664.png

107135d8c33e4403a63af8d2d6e3fc72.png

有符号数直接用int或者 signed int类型的

无符号直接用unsigned int  类型的

05064003bebb4cef89bdb54f16a176f7.png

无符号不分最高位是正数还是负数,统一正数。

a44d106b60f84f7aab17d3d255998764.png

1e2e1ca68c0f4b50bc9e0c98fe6cea05.png

整形在内存中以补码形式存储

1fe5e35fe0a3453daf909930b2d19a7b.png

2f20eef4bf7a4b11a5a64c1d09d7492c.png

1+-1是通过补码形式实现+-的

原码取反+1得补码

补码取反+1得原码

6d4d46e90ffc4d12baeac6dad18de031.png

052ed810fa6a4c24a3da1328301249f1.png

把一个数的高位字节序内容放在低地址处,把一个低位字节序内容放在高地址处。这个叫大端存储

把一个数的高位字节序内容放在高地址处,把一个低位字节序内容放在地地址处 这个叫小端存储

7073939ef6f24af49ab6f83003497eca.png

放与拿相反。比如放进去的是44 33 22 11,拿出去的是11 22 33 44

vs里存的是小端存储模式

63fb56f41f9948669888d14190ecbe81.png

2d699b757e144248be6ce70139404768.png

667cdd5936f346ba9cb74071c9e65569.png

主要看起始地址,对起始地址解引用看是不是1还是0,并且还要强制类型转换成char*类型,int类型一次性访问4个字节。

3ad494e4b4614b30b02c76676d1c7b5c.png

c1b1c77c4d4847caa7f8529f41f02fad.png

0861437787ed4889988aed34bc681fd5.png

30011b4925794b4c822c36960c5a6edb.png

1558d53ff0f047939d03f910a96333fe.png

由于c是无符号数,整形提升的时候最高位是1,由于是无符号数,前面直接补0,所以是255,正数的原码补码,反码一样。

35cc3d7147e2418a89eef06305cee350.png

相关文章:

c语言操作符详解

操作符详解 正数的原码反码补码相同 负数的原码最高位数是1&#xff0c;正数为0 整数在内存中存储的是补码 负数的左移与右移&#xff0c;移的是补码&#xff0c;打印的是源码 补码-1取反就是原码。 左移有乘2的效果 左移和右移只针对整数。 vs里的右移操作赋采用的是算数右…...

【耐水好】强耐水UV胶水它的粘接强度和普通UV胶水比如何呢

【耐水好】强耐水UV胶水它的粘接强度和普通UV胶水比如何呢 强耐水UV胶水的粘接强度与普通UV胶水相比&#xff0c;具有显著的优势。以下是详细的比较和归纳&#xff1a; 固化方式&#xff1a; 两者都是通过紫外线&#xff08;UV&#xff09;照射进行固化&#xff0c;但强耐水UV…...

jumpserver堡垒机集群搭建

1、环境 操作系统&#xff1a;龙蜥os 7.9 firewall-cmd --permanent --zonepublic --remove-servicessh firewall-cmd --permanent --zonepublic --add-rich-rulerule familyipv4 source address10.90.101.1 port port22 protocoltcp accept firewall-cmd --reload2、安装NFS…...

Termius for Mac/Win:跨平台多协议远程管理利器

Termius for Mac/Win是一款备受瞩目的跨平台多协议远程管理软件&#xff0c;以其卓越的性能、丰富的功能和便捷的操作体验&#xff0c;赢得了广大用户的青睐。无论是在企业IT管理、系统维护&#xff0c;还是个人远程连接、文件传输等方面&#xff0c;Termius都展现出了出色的实…...

Unity OpenCVForUnity 安装和第二个案例详解 <二>

目录 一、前言 二、场景介绍 1.WebCamTextureToMatExample脚本 2.FpsMonitor脚本 三、 结构体Scaler 四、找到相机并使用 1.相机的启用 2.格式转换 a.把webCamTexture转换成Mat b.把Mat转换成Texture2D 五、脚本组合 六、作者的碎碎念 一、前言 第二个案例&#xf…...

Lua实现自定义函数面向对象编程

本文目录 1、引言2、原理3、实例4、层析验证 文章对应视频教程&#xff1a; 暂无&#xff0c;可以关注我的B站账号等待更新。 点击图片或链接访问我的B站主页~~~ 1、引言 在现代软件开发中&#xff0c;面向对象编程&#xff08;OOP&#xff09;已经成为一种广泛使用的编程范式…...

docker安装消息队列mq中的rabbit服务

在现代化的分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;已经成为了一种不可或缺的组件。RabbitMQ作为一款高性能、开源的消息队列软件&#xff0c;因其高可用性、可扩展性和易用性而广受欢迎。本文将详细介绍如何在Docker环境中安装RabbitMQ服务…...

OpenAI新模型发布,免费开放GPT-4o!但只开放一点点...

GPT-4o 中的“o”代表“omni”——指的是 GPT-4o 的多模态。 该模型将向免费客户开放&#xff0c;这意味着任何人都可以通过 ChatGPT 访问 OpenAI 最先进的技术。 GPT-4o 是 OpenAI 昨天晚上发布的新旗舰模型&#xff0c;可以实时推理音频、视觉和文本。 据官方介绍&#xff0…...

idea的右边栏maven不见了(丢了)解决方案以及idea无法识别maven项目

前言 众所周知&#xff0c;idea是java开发中不可缺少的利器&#xff0c;但是由于功能过多&#xff0c;导致奇怪的问题也很多 问题汇总 idea的右边栏maven丢了 idea无法识别maven项目 对应的解决办法 idea的右边栏maven丢了 原因可能是被自己手动移除了 或者 项目没被正确…...

等待 chrome.storage.local.get() 完成

chrome.storage.local.get() 获取存储处理并计数&#xff0c;内部计数正常&#xff0c;外部使用始终为0&#xff0c;百思不得其解。 如何在继续执行之前等待异步chrome.storage.local.get()完成-腾讯云开发者社区-腾讯云 (tencent.com) 原来我忽略了异步问题&#xff0c;最简…...

004 AOP使用

文章目录 基于AspectJ的AOP的使用添加依赖编写目标类和目标方法使用XML实现实现步骤切入点表达式通知类型 使用注解实现实现步骤环绕通知注解配置定义通用切入点 纯注解方式 基于AspectJ的AOP的使用 其实就是指的SpringAspectJ整合&#xff0c;不过Spring已经将AspectJ收录到自…...

Zookeeper 集群广播事务性能如何保证?

Zookeeper 集群广播事务性能如何保证? zookeeper是如何保证广播事务时,从开始到多数节点确认事务这个高效的? 在 Zookeeper 中,确保广播事务从开始到多数节点确认的高效性至关重要。Zookeeper 通过以下几个关键机制 和优化策略来实现这一目标: ZAB 协议(Zookeeper Atom…...

【vue解决el-input组件自动填充用户名密码】

解决el-input组件自动填充用户名密码 发现用autocomplete"off"并不能解决el-input组件自动填充密码的问题。 解决方法 auto-complete"new-password" 在el-input组件添加auto-complete"new-password" 即可...

案例练习:演讲比赛

演讲比赛: 比赛规则&#xff1a; 某市举行一场演讲比赛&#xff08; speech_contest &#xff09;&#xff0c;共有 24 个人参加。比赛共三轮&#xff0c;前两轮为淘汰赛&#xff0c;第三轮为决赛。 比赛方式&#xff1a;分组比赛&#xff0c;每组 6 个人&#xff1b;选手每次…...

推荐一个很好用的Latex写代码的软件

软件名称&#xff1a;Axmath 据说是国产软件&#xff0c;好用是真好用&#xff08;去哪找&#xff1f;比如某地球号的公主号或其他地方&#xff09;我是推荐付费购买使用 1.通过图形操作&#xff0c;选择要转成Latex代码的符号&#xff0c;按下转换&#xff0c;直接就出现了我…...

windows 程序右键管理员点击无响应

Windows 程序在右键单击以管理员身份运行时没有响应&#xff0c;可能是由于多种原因引起的。下面是一些常见的问题和解决方案&#xff1a; 1. 用户账户控制 (UAC) 设置问题&#xff1a; - 试着降低或提高 UAC 设置&#xff0c;然后再试一次。可以在控制面板的“用户账户”部…...

开发基于Java语言的SaaS(Software-as-a-Service,软件即服务)模式的HIS系统详解 HIS系统源码 支持二开

开发基于Java语言的SaaS&#xff08;Software-as-a-Service&#xff0c;软件即服务&#xff09;模式的HIS系统详解 HIS系统源码 支持二开 开发基于Java语言的SaaS&#xff08;Software-as-a-Service&#xff0c;软件即服务&#xff09;模式的HIS&#xff08;Hospital Informat…...

关于微信小程序(必看)

前言 为规范开发者的用户个人信息处理行为&#xff0c;保障用户的合法权益&#xff0c;自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;微信要求&#xff0c;仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则…...

Activity中Context

Activity中Context在activity.attach()设置&#xff0c;所以Application中Context为ContextImpl appContext createBaseContextForActivity(r);&#xff0c;即在ContextImpl.createActivityContext()设置DispalyId private ContextImpl createBaseContextForActivity(Activit…...

位图法-有效的数独

有效的数独&#xff0c;主要是判断每行每列每宫有无重复元素。 每行每列用二重循环&#xff0c;每宫比较复杂&#xff0c;需要考虑每一宫的坐标与二重循环ij对应关系 行i&#xff0c;每一宫3行&#xff0c;3列 x3*(i/3)j/3 y3*(i%3)j%3...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...