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

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...