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

入门C语言:从原码、反码、补码到位运算

入门C语言:从原码、反码、补码到位运算

C语言作为一门底层编程语言,离不开对计算机硬件的深入理解。掌握整数的二进制表示法和位运算是深入学习C语言的基础。对于大一新生来说,理解原码反码补码位运算这几个概念,将帮助你更好地掌握C语言的精髓。

1. 什么是原码、反码、补码?

在计算机中,数据是以二进制的形式存储和处理的。我们通常使用二进制表示整数,但对正数和负数的表示方式却有多种。在C语言中,整数是通过补码的形式表示的,而原码和反码则是理解补码的基础。

1.1 原码(Sign-Magnitude Representation)

原码是一种简单的二进制表示法,其中二进制数的最高位用于表示符号,0表示正数,1表示负数,其余位表示数值的大小。
例如,使用8位来表示数字时:

  • +5的原码是 00000101
  • -5的原码是 10000101

在原码表示中,正数和负数是对称的,符号位简单地告诉我们数值的正负,但实际的计算过程并不方便,因此计算机很少直接使用原码来处理整数。

1.2 反码(Ones' Complement)

反码是原码的延伸。对于正数,它的反码与原码相同;而对于负数,反码是将原码的所有数值位(符号位除外)按位取反(即0变1,1变0)。
例如:

  • +5的反码是 00000101
  • -5的反码是 11111010

反码的好处在于它能更好地表示负数,但是在加减运算时,仍然需要特殊的进位处理,因此反码也不是计算机的最终选择。

1.3 补码(Twos' Complement)

补码是现代计算机用来表示带符号整数的方式。正数的补码与其二进制表示相同,而负数的补码则是在其反码的基础上加1。
例如:

  • +5的补码是 00000101
  • -5的补码是 11111011 (反码 11111010,加1得 11111011

为什么计算机使用补码? 补码的一个优势是简化了加减法的运算。使用补码表示法时,计算机无需额外区分正负数,直接进行二进制加法即可完成运算。此外,补码表示的负数只需要一个表示方式,避免了原码和反码存在的“+0”和“-0”问题。

2. 位运算:C语言中处理二进制的强大工具

位运算是C语言中的一种直接操作二进制位的方式,能够高效地处理数据,尤其在嵌入式开发和底层编程中有广泛的应用。

2.1 常见的位运算操作

在C语言中,常见的位运算操作有以下几种:

  • 按位与(&):对每一位同时为1的位结果为1,否则为0。

    5 & 3  // 结果为1,因为 0101 & 0011 = 0001
    
  • 按位或(|):只要某一位有1,结果该位就为1。

    5 | 3  // 结果为7,因为 0101 | 0011 = 0111
    
  • 按位异或(^):两位相同则为0,不同则为1。

    5 ^ 3  // 结果为6,因为 0101 ^ 0011 = 0110
    
  • 按位取反(~):将每一位的值取反,0变1,1变0。

    ~5     // 结果为-6,因为 ~0101 = 1010(补码表示-6)
    
  • 左移(<<)和右移(>>):将二进制位向左或向右移动若干位,相当于乘以或除以2的若干次幂。

    5 << 1  // 结果为10,相当于5 * 2
    5 >> 1  // 结果为2,相当于5 / 2
    
2.2 位运算的应用场景

位运算的效率非常高,常用于以下场景:

  • 设置、清除某些特定位:通过按位与或按位或操作,可以灵活地设置或清除某些位的值。例如,清除最低位可以使用与操作 &

    int x = 5;     // 0101
    x = x & 0b1110;  // 清除最低位 -> 0100 (即4)
    
  • 位掩码:通过与运算可以实现掩码功能,只保留需要的位。比如提取某个整数中的部分位数。

  • 判断奇偶性:通过与操作 & 1 可以快速判断一个数的奇偶性。如果最后一位为1,则是奇数,否则为偶数:

    if (x & 1) {printf("x 是奇数");
    } else {printf("x 是偶数");
    }
    
3. 结合实例:理解补码与位运算

我们通过一个实例来看如何结合补码与位运算来实现一些功能。

假设我们要实现一个C程序,将某个整数的所有位取反并输出:

#include <stdio.h>int main() {int x = 5;  // 原码为 00000000000000000000000000000101printf("x 的原值: %d\n", x);printf("x 取反后的值: %d\n", ~x);return 0;
}

运行这段程序后,你会发现输出的取反值是-6,这是因为 ~5 得到的是 -6 的补码 11111010。这个结果充分展示了补码和取反运算在C语言中的实际运作方式。

4. 小结

原码、反码、补码以及位运算是C语言中处理整数的关键基础。在实际编程中,计算机使用补码表示负数,简化了加法、减法等运算。位运算则提供了对二进制位的精确控制,广泛用于数据处理和优化。

相关文章:

入门C语言:从原码、反码、补码到位运算

入门C语言&#xff1a;从原码、反码、补码到位运算 C语言作为一门底层编程语言&#xff0c;离不开对计算机硬件的深入理解。掌握整数的二进制表示法和位运算是深入学习C语言的基础。对于大一新生来说&#xff0c;理解原码、反码、补码与位运算这几个概念&#xff0c;将帮助你更…...

18770 差值最大

### 思路 为了找到两个数x和y使得x - y的值最大&#xff0c;并且x在y的右侧&#xff0c;我们可以使用以下方法&#xff1a; 1. 从右向左遍历数组&#xff0c;记录当前遍历到的最大值max_right。 2. 对于每个元素a[i]&#xff0c;计算max_right - a[i]&#xff0c;并更新最大差…...

【Flutter】合并多个流Stream

1.说明 无意间发现了一个好用的库rxdart&#xff0c;它为 Dart 的 Stream 添加了额外的功能。 2.功能 &#xff08;1&#xff09;合并多个流Stream 借助Rx.combineLatest2()合并两个流stream1和stream2。 注意&#xff1a;如果dart文件中同时使用了getx&#xff0c;需要隐…...

【SQL学习笔记】

Pycharm社区版的页面中无database选项&#xff1f; 1、进入Setting-Pluggins窗口&#xff0c;输入database navigator 2、安装后&#xff0c;重启即可 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层 1、Server 层负责建⽴连接、分析和执⾏ SQL 2、存储引擎层负…...

contact form 7设置方法与详细步骤

Contact Form 7(CF7)是WordPress中非常流行的表单插件&#xff0c;用于创建和管理网站上的联系表单。以下是Contact Form 7的设置方法与详细步骤&#xff1a; 一、安装Contact Form 7插件 从WordPress后台安装&#xff1a; 登录WordPress后台&#xff0c;进入“插件”菜单下…...

第170天:应急响应-战中溯源反制对抗上线CSGoby蚁剑Sqlmap等安全工具

目录 案例一&#xff1a;溯源反制-Webshell工具-Antsword 案例二&#xff1a;溯源反制-SQL注入工具-SQLMAP 案例三&#xff1a;溯源反制-漏洞扫描工具-Goby 案例四&#xff1a;溯源反制-远程控制工具-CobaltStrike 反制Server&#xff0c;爆破密码&#xff08;通用&#x…...

5-容器管理工具Docker

├──5-容器管理工具Docker | ├──1-容器管理工具Docker | | ├──1-应用部署容器化演进之路 | | ├──2-容器技术涉及Linux内核关键技术 | | ├──3-Docker生态架构及部署 | | ├──4-使用容器运行Nginx及docker命令介绍 | | ├──5-容器镜像介…...

OCR+PDF解析配套前端工具开源详解!

目录 一、项目简介 TextIn为相关领域的前端开发提供了优秀的范本。 目前项目已在Github上开源&#xff01; 二、性能特色 三、安装使用 安装依赖启动项目脚本命令项目结构 四、效果展示 面对日常生活和工作中常见的OCR识别、PDF解析、翻译、校对等场景&#xff0c;配套的…...

【操作系统】引导(Boot)电脑的奇妙开机过程

&#x1f339;&#x1f60a;&#x1f339;博客主页&#xff1a;【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见&#xff1a;【C语言专项】 目录 什么是操作系统的引导&#xff1f; 操作系统的引导&#xff08;开机过程&#xff09; Windows操作系…...

国产云桌面迁移对接信创AD域控方案

在前文《替换AD域时&#xff0c;网络准入场景如何迁移对接国产身份域管&#xff1f;》中&#xff0c;根据 AD 在企业中的应用程度&#xff0c;我们将企业分为了轻度、中度及深度三类微软 AD 用户。 轻度AD用户&#xff1a;仅部分应用对接 AD 。替换 AD 时&#xff0c;可能会直接…...

ESP32—C3实现DS18B20(温度传感器)检测温度(Arduino IED )

1源代码&#xff08;DS18B20&#xff09; #include <OneWire.h> // 引入OneWire库&#xff0c;用于与单总线设备通信 #include <DallasTemperature.h> // 引入DallasTemperature库&#xff0c;用于读取DS18B20温度传感器数据// 定义连接到DS18B20数据引脚的GPIO编…...

Linux系统中安装KenLM步骤及注意事项

一、前言&#xff1a; Kenlm模型&#xff1a;本项目基于Kenlm统计语言模型工具训练了中文NGram语言模型&#xff0c;结合规则方法、混淆集可以纠正中文拼写错误&#xff0c;方法速度快&#xff0c;扩展性强&#xff0c;效果一般 二、安装步骤&#xff1a; 1、安装依赖项 Ke…...

xss-labs靶场第六关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、注入点寻找 2、使用hackbar进行payload测试 3、绕过结果 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机&#xff1a;本机(127.0.0.1) 靶 机&#xff1a;本机(127.0.0.…...

传智杯 第六届—E

题目描述&#xff1a; leafee 最近爱上了 abb 型语句&#xff0c;比如“叠词词”、“恶心心”。 leafee 拿到了一个只含有小写字母的字符串&#xff0c;她想知道有多少个 "abb" 型的子序列&#xff1f; 定义&#xff1a; abb 型字符串满足以下条件&#xff1a; 字符…...

2024.10月12日--- SpringMVC异常处理

异常处理 SpringMVC处理异常的方式有三种&#xff0c;当然也可以使用AOP面向编程&#xff0c;自定义一个类进入切入。 第一种&#xff1a;使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver <!--SpringMVC提供的异常处理器类型&#xff1a;SimpleMappingE…...

边缘人工智能(Edge Intelligence)

边缘人工智能&#xff08;Edge AI&#xff09;是指在边缘设备上直接运行人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;算法的技术。机器学习是一个广泛的领域&#xff0c;近年来取得了巨大的进步。它所基于的原则是&#xff0c;计算机可以通过从数据…...

C++20主要特性

Concepts&#xff08;概念&#xff09;&#xff1a; Concepts 是一种新的语言特性&#xff0c;允许程序员明确定义类型的要求&#xff0c;从而提高了模板代码的可读性和错误消息的质量。 template <typename T> concept Integral std::is_integral_v<T>;template…...

IterComp: 从模型图库中迭代合成感知反馈学习,用于文本到图像的生成

我们从多个模型中收集组成感知模型偏好&#xff0c;并采用迭代反馈学习方法&#xff0c;使基础扩散模型和奖励模型都能逐步自我完善。 我们提出了一种迭代反馈学习方法&#xff0c;通过多次迭代&#xff0c;使基础扩散模型和奖励模型逐步自我完善&#xff0c;从而以闭环方式增…...

6.Python 函数进阶(函数多返回值、函数多种传参方式、匿名函数)

一、函数多返回值 1、具体实现 def test_return():return 1, 2x, y test_return()print(x) print(y)输出结果 1 22、解析 按照返回值的顺序&#xff0c;用对应顺序的多个变量接收&#xff0c;变量之间用逗号&#xff08;,&#xff09;隔开 支持返回不同类型的数据 二、函…...

视频汇聚平台EasyCVR支持云端录像丨监控存储丨录像回看丨录像计划丨录像配置

EasyCVR视频汇聚融合平台&#xff0c;是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。平台以其强大的视频处理、汇聚与融合能力&#xff0c;在构建视频监控系统中展现出了独特的优势。 EasyCVR视频汇聚平台可接入传统监控行业中高清网络摄像机的RTSP…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

CMS内容管理系统的设计与实现:多站点模式的实现

在一套内容管理系统中&#xff0c;其实有很多站点&#xff0c;比如企业门户网站&#xff0c;产品手册&#xff0c;知识帮助手册等&#xff0c;因此会需要多个站点&#xff0c;甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...