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

C++ 之字节取反

1. 对字节进行取反

        如果你想对一个字节的所有位进行取反(即每个位从0变为1,或从1变为0),可以使用位运算符~

        例如,如果你有一个十六进制数0x6C(在C++中可以直接写作0x6C),你可以这样取反:

#include <iostream>
#include <bitset> // 用于打印二进制表示
 
int main() {
    unsigned char ten = 0x02;
    unsigned char byte = 0x6C; // 初始值为0x6C
    byte = ~byte; // 对byte的所有位进行取反
    std::cout << "ten: " << std::hex << static_cast<int>(ten) << " (" << std::bitset<8>(ten) << ")" << std::endl;
    std::cout << "Original: " << std::hex << static_cast<int>(byte) << " (" << std::bitset<8>(byte) << ")" << std::endl; // 打印原始值和二进制表示
    std::cout << "Inverted: " << std::hex << static_cast<int>(~byte) << " (" << std::bitset<8>(~byte) << ")" << std::endl; // 再次对结果取反以恢复原始值,并打印二进制表示

    unsigned char temp = ten & byte;
    std::cout << "temp: " << std::hex << static_cast<int>(temp) << " (" << std::bitset<8>(temp) << ")" << std::endl;
    return 0;
}

输出结果:

ten: 2 (00000010)
Original: 93 (10010011)
Inverted: ffffff6c (01101100)
temp: 2 (00000010)
    unsigned char temp = ten & ~0x6C;
    std::cout << "temp1: " << std::hex << static_cast<int>(temp) << " (" << std::bitset<8>(temp) << ")" << std::endl;

   输出:
    ten: 2 (00000010)
    Original: 93 (10010011)
    Inverted: ffffff6c (01101100)
    temp1: 2 (00000010)

        当你再次对取反的结果使用~操作符时,你将得到原始值。这是因为~操作符会将所有位取反。例如,对于0x6C,其取反结果为0xFFFFFF93(如果byteunsigned char类型的话,实际上只有最低8位有意义,其余高位将被忽略),再次取反则为原始值。如果你想要看到完整的8位二进制表示,可以使用上面代码中的方法通过std::bitset<8>来打印。

注意:

  • 使用~操作符时,确保你了解其对数据类型的影响,特别是对于无符号整型和有符号整型。在无符号整型中,所有位都被取反。而在有符号整型中,最高位(符号位)也被取反,这可能会导致数值的符号改变(从正变负或从负变正),除非你明确知道你在做什么。对于有符号整型,通常的做法是先将其转换为无符号类型再进行操作。

  • 在上面的示例中,我使用了static_cast<int>来确保在打印时能够正确显示数值,因为直接打印无符号字符可能会导致一些混淆或错误的结果。对于演示目的,我使用了这种方式。但在实际编程中,通常不需要这样做,除非你需要查看具体的数值。直接使用无符号字符类型进行计算和操作通常是更安全的。

相关文章:

  • STM32常见外设的驱动示例和代码解析
  • 性能测试和Jmeter
  • C语言_数据结构总结6:链式栈
  • MySQL作业一
  • 量子计算测试挑战:软件测试将如何迎接新纪元?
  • 步进电机软件细分算法解析与实践指南
  • c++ 操作符重载详解与示例
  • Vue3:本地启动Vue3项目失败,报not found xxx moudel
  • 智能硬件如何和应用层app连接?
  • 08动态库与静态库
  • 云服务器Linux安装Docker
  • ElasticSearch 分词器介绍及测试:Standard(标准分词器)、English(英文分词器)、Chinese(中文分词器)、IK(IK 分词器)
  • Compounding Geometric Operations for Knowledge Graph Completion(论文笔记)
  • 深度学习驱动的智能化革命:从技术突破到行业实践
  • 深入剖析 ConcurrentHashMap:高并发场景下的高效哈希表
  • C++————类和对象(一)
  • PyQt组件间的通信方式
  • CSS—属性继承与预处理器:2分钟掌握预处理器
  • 【HeadFirst系列之HeadFirstJava】第13天之深入学习 Java GUI 编程 —— 使用 Swing 开发桌面应用
  • VS大型CPP项目调试,Debug模式,Release模式,附加到进程模式
  • 音乐培训如何做网站宣传/泉州关键词快速排名
  • 网站建站需要什么软件/兰州seo外包公司
  • app源码WordPress淘客/好用的seo软件
  • 要看网站是多少/二次感染即将大爆发
  • 做网站的图片/seo实战培训教程
  • 网站设计公司排名前十/网络推广平台有哪些渠道