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

C语言进阶教程(位操作和进制数的表示)

文章目录

  • 前言
  • 一、左移和右移
  • 二、清除对应的位为0和设置对应的位为1
    • 1.设置对应的位为1
    • 2.清除对应的位为0
  • 三、进制数的表示
  • 四、& ^ | ~
  • 总结


前言

本篇文章给大家讲解一下C语言中的位操作,在嵌入式中位操作是经常需要使用的,那么下面就让我们来学习一下C语言中的位操作吧。

一、左移和右移

在C语言中,左移(<<)和右移(>>)是位操作运算符,用于对整数类型的数据进行位级操作。这些操作符可以将二进制表示的整数值按指定的位数向左或向右移动,并根据移动方向填充或丢弃相应的位。

左移运算符(<<)将一个数的各二进制位全部左移若干位,右侧空出的位用零填充。其语法为:

result = operand << n;

其中,operand是要进行操作的数值,n是要左移的位数,result是计算结果。左移运算的效果是将operand的二进制表示左移n位。

例如,假设有一个整数变量 x 的值为 5,其二进制表示为 0000 0101,我们对其左移两位,即 x << 2:

int x = 5;
int result = x << 2;

左移两位后,二进制值变为 0001 0100(二进制表示),对应的十进制数即为 20。因此,result的值将为 20。

右移运算符(>>)将一个数的各二进制位全部右移若干位,但右移运算符有两种方式:逻辑右移和算术右移。

逻辑右移(logical right shift):右移过程中左侧空出的位用零填充,适用于无符号数。

算术右移(arithmetic right shift):右移过程中左侧空出的位用符号位填充,适用于带符号数。

其语法为:

result = operand >> n;

其中,operand是要进行操作的数值,n是要右移的位数,result是计算结果。右移运算的效果是将operand的二进制表示右移n位。

例如,有一个有符号整数变量 x 的值为 15(二进制表示为 0000 1111),我们对其右移三位,即 x >> 3:

int x = 15;
int result = x >> 3;

逻辑右移后,二进制值变为 0000 0001,对应的十进制数为 1,因此 result 的值将为 1。

需要注意的是,右移运算对于带符号整数会保留符号位,因此如果原始数值为负数(符号位为 1),算术右移将填充 1,使得结果仍为负数。

二、清除对应的位为0和设置对应的位为1

在嵌入式中设置和清除某位是非常常用的,这里我们就来看看怎么设置某位为1和清除某位为0吧。

1.设置对应的位为1

#include <stdio.h>int main(void)
{unsigned char a = 0;int i = 0;scanf("%d", &i);printf("a = %d\n", a | (1 << i));//设置第i位为1return 0;
}

通过位运算符 | 将 1 左移 i 位,并将结果与变量 a 进行按位或操作。这样可以将变量 a 的第 i 位设置为 1,而其他位保持不变。

2.清除对应的位为0

#include <stdio.h>int main(void)
{unsigned char a = 255;int i = 0;scanf("%d", &i);printf("a = %d\n", a & ~(1 << i));return 0;
}

通过位运算符 ~ 将 1 左移 i 位,并将结果与变量 a 进行按位与操作。这样可以将变量 a 的第 i 位设置为 0,而其他位保持不变。

三、进制数的表示

在C语言中,数字可以用不同的进制表示,包括十进制、八进制和十六进制。以下是这些进制的表示方法以及相应的C代码示例:

1.十进制:十进制是我们日常生活中最常见的进制,数字默认情况下就是十进制的。例如,数字42就是十进制。

int decimalNumber = 42;

2.八进制:在C语言中,八进制数字以0开头。例如,八进制数字052表示十进制的42。

int octalNumber = 052;

3.十六进制:十六进制数字以0x或0X开头。例如,十六进制数字0x2A表示十进制的42。

int hexadecimalNumber = 0x2A;

这些示例展示了如何在C语言中表示不同进制的数字。你可以使用这些表示法来初始化整数变量,进行算术运算,或者将它们输出到屏幕上。注意,C语言中默认情况下使用的是十进制,如果你需要在其他进制之间进行转换,可能需要使用相关的函数或操作来实现。

四、& ^ | ~

1.按位与 &:

运算符:&
功能:执行按位与操作,将两个操作数的对应位进行比较,如果两个位都为1,则结果位为1,否则为0。
示例代码:

int x = 5; // 二进制表示为 0101
int y = 3; // 二进制表示为 0011
int result = x & y; // 结果为 0001,即 1

2.按位或 |:

运算符:|
功能:执行按位或操作,将两个操作数的对应位进行比较,如果任何一个位为1,则结果位为1。
示例代码:

int x = 5; // 二进制表示为 0101
int y = 3; // 二进制表示为 0011
int result = x | y; // 结果为 0111,即 7

3.按位异或 ^:

运算符:^
功能:执行按位异或操作,将两个操作数的对应位进行比较,如果两个位不同,则结果位为1,如果相同则为0。
示例代码:

int x = 5; // 二进制表示为 0101
int y = 3; // 二进制表示为 0011
int result = x ^ y; // 结果为 0110,即 6

4.按位取反 ~:

运算符:~
功能:执行按位取反操作,翻转一个整数的每个二进制位,将1变为0,将0变为1。
示例代码:

int x = 5; // 二进制表示为 0101
int result = ~x; // 结果为 1010,即 -6(根据补码表示)

总结

本篇文章就讲解到这里,希望大家将上面讲解的知识牢牢掌握。

相关文章:

C语言进阶教程(位操作和进制数的表示)

文章目录 前言一、左移和右移二、清除对应的位为0和设置对应的位为11.设置对应的位为12.清除对应的位为0 三、进制数的表示四、& ^ | ~总结 前言 本篇文章给大家讲解一下C语言中的位操作&#xff0c;在嵌入式中位操作是经常需要使用的&#xff0c;那么下面就让我们来学习一…...

Loguru:功能强大、简单易用的Python日志库

文章目录 Loguru:Python的日志库安装 Loguru基本用法配置 Loguruadd() 语句remove() 语句设置日志文件保留日志的等级设置控制台日志显示等级Loguru:Python的日志库 Loguru 是一个功能强大、简单易用的日志库,可以让 Python 的日志记录变得更加轻松。它提供了丰富的功能和配…...

idea之maven的安装与配置

我们到maven的官网里下载maven&#xff0c;地址&#xff1a;https://maven.apache.org/download.cgi下载完成后解压即可配置环境变量 此电脑–>右键–>属性–>高级系统设置–>环境变量–>系统变量&#xff08;S&#xff09;–>新建一个系统变量 变量名&…...

【最新面试问题记录持续更新,java,kotlin,android,flutter】

最近找工作&#xff0c;复习了下java相关的知识。发现已经对很多概念模糊了。记录一下。部分是往年面试题重新整理&#xff0c;部分是自己面试遇到的问题。持续更新中~ 目录 java相关1. 面向对象设计原则2. 面向对象的特征是什么3. 重载和重写4. 基本数据类型5. 装箱和拆箱6. …...

面试:经典问题解决思路

1. 秒杀系统架构 参考&#xff1a;秒杀系统架构优化思路 2. 如何防止订单重复提交 重复提交原因: 一种是由于用户在短时间内多次点击下单按钮&#xff0c;或浏览器刷新按钮导致。另一种则是由于Nginx或类似于SpringCloud Gateway的网关层&#xff0c;进行超时重试造成的。 方案…...

CG MAGIC分享3ds Max卡顿未保存处理方法有哪些?

3ds Max进行建模、渲染这一系列过程中&#xff0c;大家使用中都会遇到各种原因导致软件卡顿或崩溃是很常见的情况。 可以说卡机没关系&#xff0c;可是卡顿发生时&#xff0c;如果之前的工作没有及时保存&#xff0c;可能会导致数据的丢失和时间的浪费。这就是最让人烦躁的了&…...

[python 刷题] 238 Product of Array Except Self

[python 刷题] 238 Product of Array Except Self 题目&#xff1a; Given an integer array nums, return an array answer such that answer[i] is equal to the product of all the elements of nums except nums[i]. The product of any prefix or suffix of nums is guar…...

UG NX二次开发(C#)-计算直线到各个坐标系轴向的投影角度

文章目录 1、前言2、需求分析3、NXOpen方法实现3.1 创建基准坐标系3.2 然后计算直线到基准坐标系的轴向角度3.3 代码调用4、测试效果为:1、前言 最近有个粉丝问我如何计算直线到坐标系各个轴向的角度,这里用UG NX二次开发(C#)实现。当然,这里的内容是经验之谈,如果有更好的…...

C# ComboBox 和 枚举类型(Enum)相互关联

C# ComboBox 和 枚举类型(Enum)相互关联 目的 在C# Winform面板上的ComboBox选择项&#xff0c;由程序填写某个Enum的各个枚举项目。 在运行中读取ComboBox的选择项&#xff0c;返回Enum数值。 非编程方法 低阶做法可以在winform设计窗口手动填写&#xff0c;但是不会自动跟…...

Linux CentOS7 tree命令

tree就是树&#xff0c;是文件或文件名输出到控制台的一种显示形式。 tree命令作用&#xff1a;以树状图列出目录的内容&#xff0c;包括文件、子目录及子目录中的文件和目录等。 我们使用ll命令显示只能显示一个层级的普通文件和目录的名称。而使用tree则可以树的形式将指定…...

软件设计模式系列之九——桥接模式

1 模式的定义 桥接模式是一种结构型设计模式&#xff0c;它用于将抽象部分与其实现部分分离&#xff0c;以便它们可以独立地变化。这种模式涉及一个接口&#xff0c;它充当一个桥&#xff0c;使得具体类可以在不影响客户端代码的情况下改变。桥接模式将继承关系转化为组合关系…...

构造函数的调用规则

#include <iostream> #include <string> using namespace std; class person{ public:int m_age; // person(){ // cout<<"默认构造的调用"<<endl; // } // person(int age){ // m_ageage; // cout<<"有参构造的调用"<…...

第十章:枚举类与注解

10.1&#xff1a;枚举类的使用 当需要定义一组常量时&#xff0c;建议使用枚举类&#xff08;前提&#xff1a;类的对象只有有限个&#xff0c;确定的&#xff09; eg&#xff1a; 星期&#xff1a;Mondey、.....、Sunday 性别&#xff1a;Man、.....、Woman 线程状态&#xff…...

ChatGPT:字符串操作问题——提取包含括号的字符串中的题干内容

ChatGPT&#xff1a;字符串操作问题——提取包含括号的字符串中的题干内容 String title p.text().split(“(”)[0];为什么会报错 ChatGPT&#xff1a; 在这段代码中&#xff0c;您正在使用Java处理一个字符串&#xff08;假设是HTML或文本&#xff09;&#xff0c;尝试将其分…...

jvm中对象创建、内存布局以及访问定位

对象创建 Java语言层面&#xff0c;创建对象通常&#xff08;例外&#xff1a;复制、反序列化&#xff09;仅仅是一个new关键字即可&#xff0c;而在虚拟机中&#xff0c;对象&#xff08;限于普通Java对象&#xff0c;不包括数组和Class对象等&#xff09;的创建又是怎样一个过…...

C基础-操作符详解

操作符分类&#xff1a; 算数操作符&#xff1a; - * / % //算数操作符 // int main() // { // // /除法 1.整数除法(除号两端都是整数) 2浮点数除法&#xff0c;除号的两端只要有一个小数就执行小数除法 // // 除法中&#xff0c;除数为0 // int a 7 / 2; /…...

时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测

时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测。…...

【深度学习实验】线性模型(五):使用Pytorch实现线性模型:基于鸢尾花数据集,对模型进行评估(使用随机梯度下降优化器)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 线性模型linear_model 2. 损失函数loss_function 3. 鸢尾花数据预处理 4. 初始化权重和偏置 5. 优化器 6. 迭代 7. 测试集预测 8. 实验结果评估 9. 完整代码 一、实验介…...

ADB底层原理

介绍 adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb我们可以在Eclipse/Android Studio中方便通过DDMS来调试Android程序&#xff0c;说白了就是debug工具。adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的and…...

etcd之读性能主要影响因素

1、Raft模块-线性读ReadIndex-节点之间的RTT延时、磁盘IO 线性读时Follower节点首先会向Raft 模块发送ReadIndex请求&#xff0c;此时Raft模块会先向各节点发送心跳确认&#xff0c;一半以上节点确认 Leader 身份后由leader节点将已提交日志索引 (committed index) 封装成 Rea…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...