跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

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

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

NodeJser发布于 2026/3/21更新于 2026/8/2360 浏览
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++ 表示
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 基于星辰 RPA 的小红书自动发文机器人实现指南
  • Python 兼职方向与接单指南:从入门到实战
  • Android 性能优化实战指南:核心原理与面试应对策略
  • 通义万相 2.1 模型核心功能与云端部署指南
  • AIGC赋能Java编程:智能工具提升效率与创新
  • Ubuntu 部署 ToolJet 低代码平台及内网穿透远程访问
  • 无线联邦学习:隐私保护下的 AI 协同演进
  • Java 面试题及答案汇总
  • 主流大模型降英文 AI 检测率横向测评:千问、DeepSeek、KIMI 等对比
  • 前端三剑客:HTML、CSS、JavaScript 如何协同工作
  • C++ 核心面试题与知识点详解
  • 智能家居电平转换电路实战:从理论到PCB制作
  • 前端反爬实战:基于环境检测日志补全 Window 对象缺失属性
  • UI UX Pro Max:打造懂设计的 AI 前端开发搭档
  • Ant Design Form 表单组件实现原理
  • 深入超标量架构与并行执行技术
  • AI 时代技术民主化:文科生为何成最大受益者
  • Git Cherry-Pick 实战用法与常见场景解析
  • Python 数据分析与自动化 30 个实战技巧
  • 网络安全工程师岗位需求分析与职业发展路径

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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