跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

C/C++按位取反操作详解与代码示例

综述由AI生成C/C++按位取反运算符~的使用原理及代码实现。文章阐述了原码、反码、补码在计算机存储中的区别,解释了负数补码的计算方式。通过 C 语言和 C++ 代码示例,展示了无符号与有符号整数取反后的二进制变化及十进制结果差异,重点分析了 10 取反得 -11 以及 0 取反得 -1 的原因。

NodeJser发布于 2026/3/21更新于 2026/4/2615 浏览
C/C++按位取反操作详解与代码示例

C/C++按位取反操作详解

按位取反:~

按位取反运算符 ~ 会将二进制位中的 1 变为 0,0 变为 1。

原码、反码和补码

  • 原码:最高位是符号位,0 表示正数,1 表示负数。
  • 反码:最高位是符号位,0 表示正数,1 表示负数。正数的反码是它本身,负数的反码是除了符号位以外其余各位取反。
  • 补码:最高位是符号位,0 表示正数,1 表示负数。正数的补码是它本身,负数的补码是反码 +1。

为什么需要补码操作

例如:1 + (-1) = 0

  • 如果使用原码直接计算:0001 + 1001 = 1010,结果是 -2,这是错误的。
  • 如果使用补码计算:0001 + 1111 = 1 0000,最高位的 1 溢出,结果是 0000,即 0。

原码和补码的转化方式

  • 补码转原码:正数不变,负数除了符号位以外,其余各位取反 +1。
  • 原码转补码:正数不变,负数除了符号位以外,其余各位取反 +1。

为什么 10 取反之后会变为 -11

计算机中存储方式都是按照补码的形式存储的。正数的补码是它本身,负数补码等于反码 +1。

所以 10 对应的二进制是 0000 1010,取反之后 1111 0101。最高位是 1,代表符号位,说明这个数是负数。这是补码,如果要拿到十进制的结果,必须将其转化为原码才能看到。原码是补码取反 +1 得来的,所以原码除了符号位以外,各位取反 +1 获取:1000 1010 + 1 = 1000 1011,这个值就是 -11。

C 语言表示

#include <stdio.h>

int main() {
    // 1. 无符号字符型变量的按位取反
    unsigned char ch = 0; // 定义无符号字符型变量 ch,初始值为 0
    // unsigned char 是 8 位无符号整数(范围 0~255),没有符号位,所有位都用于表示数值
    // 此时 ch 的 8 位二进制为:0000 0000(每一位都是 0)
    ch = ~ch; // 对 ch 进行按位取反操作(~是按位取反运算符)
    // 按位取反规则:二进制的每一位 0 变 1,1 变 0
    // 原来的二进制:0000 0000
    // 取反后变为:1111 1111(8 位全是 1)
    // 对于无符号数,11111111 转换为十进制是 255(计算:128+64+32+16+8+4+2+1=255)
    printf("%d\n", ch); // 打印 ch 的值,输出 255

    // 2. 有符号整型变量的按位取反
    int number = ; 
    
    
    
    number = ~number; 
    
    
    
    
    
    
    
    
    (, number); 
     ;
}
10
// 定义有符号整型变量 number,初始值为 10
// int 是 32 位有符号整数(部分系统是 64 位,这里以 32 位为例)
// 有符号数的最高位是符号位(0 表示正数,1 表示负数),其余位表示数值
// 10 的 32 位二进制(原码):00000000 00000000 00000000 00001010
// 对 number 进行按位取反操作
// 按位取反后,每一位 0 变 1,1 变 0,结果为:
// 11111111 11111111 11111111 11110101
// 此时最高位是 1,表示这是一个负数
// 计算机中负数用补码表示,要得到十进制值需转换为原码:
// 补码转原码步骤:先取反(符号位不变),再加 1
// ① 补码:11111111 11111111 11111111 11110101
// ② 取反(符号位不变):10000000 00000000 00000000 00001010
// ③ 加 1:10000000 00000000 00000000 00001011(即 -11)
printf
"%d\n"
// 打印 number 的值,输出 -11
return
0

C++ 表示

#include <iostream>
#include <bitset>

using namespace std;

int main() {
    // 1. 无符号整数的按位取反(unsigned int)
    unsigned int u_num = 5; // 无符号数 5
    unsigned int u_result = ~u_num; // 按位取反操作
    cout << "=== 无符号整数的按位取反 ===" << endl;
    // 用 bitset<8> 显示 8 位二进制(简化观察,实际是 32/64 位)
    cout << u_num << " 的二进制:" << bitset<8>(u_num) << endl; // 00000101
    cout << "取反后二进制:" << bitset<8>(u_result) << endl; // 11111010
    cout << "取反后的值:" << u_result << endl << endl; // 250(8 位情况下)

    // 2. 有符号整数的按位取反(int)
    int s_num = 5; // 有符号数 5
    int s_result = ~s_num; // 按位取反操作
    cout << "=== 有符号整数的按位取反 ===" << endl;
    cout << s_num << " 的二进制:" << bitset<8>(s_num) << endl; // 00000101(正数原码)
    cout << "取反后二进制:" << bitset<8>(s_result) << endl; // 11111010(负数补码)
    cout << "取反后的值:" << s_result << endl; // -6(补码转十进制的结果)

    // 3. 特殊案例:对 0 进行取反
    int zero = 0;
    cout << "\n=== 对 0 进行按位取反 ===" << endl;
    cout << zero << " 的二进制:" << bitset<8>(zero) << endl; // 00000000
    cout << "取反后二进制:" << bitset<8>(~zero) << endl; // 11111111
    cout << "取反后的值(有符号):" << ~zero << endl; // -1(32 位下是 -1)
    cout << "取反后的值(无符号):" << (unsigned int)~zero << endl; // 4294967295(32 位无符号最大值)
    return 0;
}

目录

  1. C/C++按位取反操作详解
  2. 按位取反:~
  3. 原码、反码和补码
  4. 为什么需要补码操作
  5. 原码和补码的转化方式
  6. 为什么 10 取反之后会变为 -11
  7. C 语言表示
  8. C++ 表示
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 数据结构入门:C 语言单链表实现
  • WebRTC 在 Android 中的应用实战
  • 为什么要学习 Python Web?主流框架 Django、Flask、FastAPI 如何选择?
  • GitHub Copilot 配置性能优化关键技术
  • Clang 17 下的 C++26 特性实战指南
  • OpenClaw macOS Sequoia M1 Pro 架构安装指南
  • Flutter 与 Web 混合开发技术实践
  • IDEA 中清理未使用的 JDK 版本
  • OD 机试真题:机器人活动区域
  • AIGC 在元宇宙与虚拟世界中的应用及技术实现
  • Python 包管理新范式:极速工具 uv 解析与实战
  • LLM 大模型学习指南:从原理到工程化应用实战
  • Ubuntu 24.04 安装 ToDesk 远程桌面及配置
  • Python 变量命名规则与规范代码习惯
  • Python 分支结构与循环结构应用实战
  • 高精度磁电绝对式编码器算法及方案实现
  • Flutter 三方库 dart_webrtc 的鸿蒙化适配指南
  • 大语言模型基础:核心概念、架构与应用详解
  • Vue3+TypeScript 中 Promise<string> 转 string 类型错误解析及异步处理
  • Qt 与 Linux Socket 跨平台通信深度解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online