当前位置: 首页 > 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…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...