C语言学习笔记-初阶(27)操作符详解1:位操作

news2025/3/5 19:43:07

1. 操作符的分类

上述的操作符,我们已经学过算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单目操作符,今天继续介绍⼀部分,操作符中有一些操作符和二进制有关系,我们先铺垫一下二进制的和进制转换的知识。

2. 二进制、进制转换

其实我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢?其实2进制、8进制、10进制、16进制是数值的不同表示形式而已。

比如:数值15的各种进制的表示形式:

15的2进制:1111
15的8进制:17
15的10进制:15
15的16进制:F

我们重点介绍一下二进制:

首先我们还是得从10进制讲起,其实10进制是我们生活中经常使用的,我们已经形成了很多尝试:

10进制中满10进1

10进制的数字每⼀位都是0~9的数字组成

其实二进制也是一样的

2进制中满2进1

2进制的数字每一位都是0~1的数字组成

那么 1101 就是二进制的数字了。

2.1 2进制转10进制

其实10进制的123表示的值是⼀百⼆⼗三,为什么是这个值呢?其实10进制的每一位是权重的,10进制的数字从右向左是个位、十位、百位....,分别每一位的权重是 10^0, 10^1, 10^2 ... 

如下图:

2进制和10进制是类似的,只不过2进制的每一位的权重,从右向左是: 2^0 , 2^1 , 2^2 ... 

如果是2进制的1101,该怎么理解呢?

2.1.1 10进制转2进制数字

注意事项:是从下往上依次写出来作为2进制数,最下面是最高位

2.2 2进制转8进制和16进制

2.2.1 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.2.2 2进制转16进制

16进制的数字每一位是0~9,a ~f 的,0~9,a ~f的数字,各自写成2进制,最多有4个2进制位就足够了,比如 f 的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进制位会换算一个16进制位,剩余不够4个二进制位的直接换算。

如:2进制的01101011,换成16进制:0x6b,16进制表示的时候前面加0x

3. 原码、反码、补码

整数的2进制表示方法有三种,即原码、反码和补码

有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号 位,剩余的都是数值位。

符号位都是用0表示“正”,用1表示“负”。

正整数的原、反、补码都相同。

负整数的三种表示方法各不相同。

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1就得到补码。

反码得到原码也是可以使用:取反,+1的操作。

对于整形来说:数据存放内存中其实存放的是补码。

为什么呢?

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

4. 移位操作符

<< 左移操作符

>> 右移操作符

注:移位操作符的操作数只能是整数。

4.1 左移操作符

移位规则:左边抛弃、右边补0

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

4.2 右移操作符

移位规则:首先右移运算分两种:

1. 逻辑右移:左边用0填充,右边丢弃

2. 算术右移:左边用原该值的符号位填充,右边丢弃

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

警告⚠️:对于移位运算符,不要移动负数位,这个是标准未定义的。

例如:

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

5. 位操作符

位操作符有:

& //按位与
| //按位或

^ //按位异或
~ //按位取反

注:他们的操作数必须是整数。

直接上代码:

#include <stdio.h>
int main()
{
 int num1 = -3;
 int num2 = 5;
 printf("%d\n", num1 & num2);
 printf("%d\n", num1 | num2);
 printf("%d\n", num1 ^ num2);
 printf("%d\n", ~0);
 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;
}

练习1:编写代码实现:求⼀个整数存储在内存中的⼆进制中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;
}

//思考还能不能更加优化,这⾥必须循环32次的。

//⽅法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;
}
//这种⽅式是不是很好?达到了优化的效果,但是难以想到。

练习2:⼆进制位置0或者置1

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

13的2进制序列: 00000000000000000000000000001101
将第5位置为1后:00000000000000000000000000011101
将第5位再置为0:00000000000000000000000000001101

参考代码:

#include <stdio.h>
int main()
{
 int a = 13;
 a = a | (1<<4);
 printf("a = %d\n", a);
 a = a & ~(1<<4);
 printf("a = %d\n", a);
 return 0;
}

6. 单目操作符

单目操作符有这些:

!、++、--、&、*、+、-、~ 、sizeof、(类型)

单目操作符的特点是只有一个操作数,在单目操作符中只有 & (取地址)和 * (解引用)没有介绍,这2个操作符,我们放在学习指针的时候学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全需要学多久才能入门?

网络安全是一个复杂且不断发展的领域&#xff0c;想要入行该领域&#xff0c;我们需要付出足够多的时间和精力好好学习相关知识&#xff0c;才可以获得一份不错的工作&#xff0c;那么网络安全需要学多久才能入门?我们通过这篇文章来了解一下。 学习网络安全的入门时间因个人的…

20250304学习记录

第一部分&#xff0c;先来了解一下各种论文期刊吧&#xff0c;毕竟也是这把岁数了&#xff0c;还什么都不懂呢 国际期刊&#xff1a; EI收集的主要有两种&#xff0c; JA&#xff1a;EI源刊 CA&#xff1a;EI会议 CPCI也叫 ISTP 常说的SCI分区是指&#xff0c;JCR的一区、…

【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架

【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架 1. 引言 本教程旨在帮助嵌入式开发小白从零开始&#xff0c;学习如何在STM32F407微控制器上实现一个基于串口的数据接收程序。该程序能够通过判断数据头来接收一串数据&#xff0c;并将其存储到缓冲区中…

文件上传复现

文件上传漏洞的概念 在现代互联网的web应用程序中&#xff0c;上传文件是一种常见的功能&#xff0c;因为它有助于提高业务效率&#xff0c;比如社交 网站中&#xff0c;允许用户上传图片、视频、头像和许多其他类型的文件。然而向用户提供的功能越多&#xff0c; web应 用受到…

Redis——缓存穿透、击穿、雪崩

缓存穿透 什么是缓存穿透 缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中&#xff0c;导致请求直接到了数据库上&#xff0c;根本没有经过缓存这一层。举个例子&#xff1a;某个黑客故意制造我们缓存中不存在的 key 发起大量请求&#xff0c;导致大量请求落到数据库…

HMC7043和HMC7044芯片配置使用

一,HMC7043芯片 MC7043独特的特性是对14个通道分别进行独立灵活的相位管理。所有14个通道均支持频率和相位调整。这些输出还可针对50 Ω或100 Ω内部和外部端接选项进行编程。HMC7043器件具有RF SYNC功能,支持确定性同步多个HMC7043器件,即确保所有时钟输出从同一时钟沿开始…

VSCode知名主题带毒 安装量900万次

目前微软已经从 Visual Studio Marketplace 中删除非常流行的主题扩展 Material Theme Free 和 Material Theme Icons&#xff0c;微软称这些主题扩展包含恶意代码。 统计显示这些扩展程序的安装总次数近 900 万次&#xff0c;在微软实施删除后现在已安装这些扩展的开发者也会…

mybatis映射文件相关的知识点总结

mybatis映射文件相关的知识点总结 mybatis官网地址 英文版&#xff1a;https://mybatis.org/mybatis-3/index.html 中文版&#xff1a;https://mybatis.p2hp.com/ 搭建环境 /* SQLyog Ultimate v10.00 Beta1 MySQL - 8.0.30 : Database - mybatis-label *****************…

【UCB CS 61B SP24】Lecture 21: Data Structures 5: Priority Queues and Heaps 学习笔记

本文介绍了优先队列与堆&#xff0c;分析了最小堆的插入与删除过程&#xff0c;并用 Java 实现了一个通用类型的最小堆。 1. 优先队列 1.1 介绍 优先队列是一种抽象数据类型&#xff0c;其元素按照优先级顺序被处理。不同于普通队列的先进先出&#xff08;FIFO&#xff09;&…

爬虫系列之发送请求与响应《一》

一、请求组成 1.1 请求方式&#xff1a;GET和POST请求 GET:从服务器获取&#xff0c;请求参数直接附在URL之后&#xff0c;便于查看和分享&#xff0c;常用于获取数据和查询操作 POST&#xff1a;用于向服务器提交数据&#xff0c;其参数不会显示在URL中&#xff0c;而是包含在…

小米手机如何录制屏幕?手机、电脑屏幕录制方法分享

大家最近有没有遇到想记录手机屏幕操作的情况&#xff1f; 比如精彩的游戏瞬间、有趣的视频教程&#xff0c;或者需要录制屏幕来制作演示材料。小米手机在这方面可是个好帮手&#xff0c;今天就来给你好好唠唠&#xff0c;小米手机如何录制屏幕&#xff0c;以及后续如何处理这…

3D Web轻量化引擎HOOPS Communicator的核心优势解析:高性能可视化与灵活部署!

在当今数字化时代&#xff0c;工业领域的工程应用不断向基于Web的方向发展&#xff0c;而HOOPS Web平台作为一款专为构建此类工程应用程序打造的软件开发套件集&#xff0c;正发挥着日益重要的作用&#xff0c;成为构建强大工程应用的基石。 一、HOOPS Web平台概述 HOOPS Web…

从 JVM 源码(HotSpot)看 synchronized 原理

大家好&#xff0c;我是此林。 不知道大家有没有这样一种感觉&#xff0c;网上对于一些 Java 框架和类的原理实现众说纷纭&#xff0c;看了总是不明白、不透彻。常常会想&#xff1a;真的是这样吗&#xff1f; 今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全…

深入探索Python机器学习算法:模型调优

深入探索Python机器学习算法&#xff1a;模型调优 文章目录 深入探索Python机器学习算法&#xff1a;模型调优模型调优1. 超参数搜索方法1.1 网格搜索&#xff08;Grid Search&#xff09;1.2 随机搜索&#xff08;Random Search&#xff09;1.3 贝叶斯优化&#xff08;Bayesia…

postman请求后端接受List集合对象

后端集合 post请求&#xff0c;即前端请求方式

Kimi“撞车”DeepSeek!新一代注意力机制的极限突破!

近期&#xff0c;各方大佬在注意力机制上又“打起来了”。首先登场的是顶流DeepSeek&#xff0c;新论文梁文锋署名&#xff0c;提出了一种新的注意力机制NSA。同天&#xff0c;Kimi杨植麟署名的新注意力架构MoBA开源。紧接着&#xff0c;华为诺亚提出高效选择注意力架构ESA。 …

计算机网络---SYN Blood(洪泛攻击)

文章目录 三次握手过程SYN Flood攻击原理防御措施协议层优化网络层拦截系统配置调整 TCP协议是 TCP/IP 协议栈中一个重要的协议&#xff0c;平时我们使用的浏览器&#xff0c;APP等大多使用 TCP 协议通讯的&#xff0c;可见 TCP 协议在网络中扮演的角色是多么的重要。 TCP 协议…

Ollama存在安全风险的情况通报及解决方案

据清华大学网络空间测绘联合研究中心分析&#xff0c;开源跨平台大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患。鉴于目前DeepSeek等大模型的研究部署和应用非常广泛&#xff0c;多数用户使用Ollama私有化部署且未修改默认配置&#xff0c;存在数据泄露、算力盗…

健康医疗大数据——医疗影像

一、 项目概述 1.1 项目概述 1.2 项目框架 1.3 项目环境 1.4 项目需求 二、项目调试与运行 2.1需求分析 2.2具体实现 三、项目总结 项目概述 项目概述 本项目旨在应用大数据技术于医疗影像领域&#xff0c;通过实训培养团队成员对医疗大数据处理和分析的实际…

学生管理信息系统的需求分析与设计

伴随教育的迅猛演进以及学生规模的不断扩增&#xff0c;学生管理信息系统已然成为学校管理的关键利器。此系统能够助力学校管控学生的课程成绩、考勤记载、个人资讯等诸多数据&#xff0c;提升学校的管理效能与服务品质。 一.需求分析 1.1 学生信息管理 学生信息在学校管理体…