• 学习在C++中使用位运算符做“int”和“4个char”之间的转换


    位运算符

    “位运算符” 是将数据以二进制的方式进行的计算。运算符有:
    &
    |
    ^ 异或
    ~ 取反
    >> 右移
    << 左移

    由于数据最底层都是二进制的,因此以二进制的方式计算可以实现一些较为底层的操作。
    比如某一变量是 “32位的int”,但实际想让它表示为 “4个8位的char”,就需要用到位操作符了。

    (可以用这个工具来转换十进制为二进制)

    >> 的例子

    >> n直观地将二进制数据右移n位,也就是作为二进制去掉后面n位。

    比如,右移 3 3 3 位相当于缩小了 2 3 2^3 23 ,所以:

    std::cout << (8000 >> 3);
    
    • 1

    将会输出:

    1000
    
    • 1

    当然,不一定是整倍数。比如奇数的末尾不是0。例如789对应于二进制1100010101

    std::cout << (789 >> 2);
    
    • 1

    将会输出:

    197
    
    • 1

    197对应于11000101,可以看到这个数字正是789对应二进制数字去掉后面2位。

    & 的例子

    &表示 操作。
    A & B 相当于将AB都转换为二进制,然后对于每一位都进行 操作。

    比如:

    std::cout << (789 & 654);
    
    • 1

    将会输出

    516
    
    • 1

    当然,以十进制显示的话不直观。但是如果将这几个数转换为二进制的话则会比较直观:

    1100010101 (789)
    1010001110 (654)
    1000000100 (516)
    
    • 1
    • 2
    • 3

    可以看出,对于每一位:仅在789654在那一位上的数都是1时,结果516才是1

    int和4个char之间的转换

    由于int的二进制有32位,char是8位。所以很自然的想法是int里的32位中每8位表示一个char

    所以将int转换为4个char的方法就是:先右移 0/8/16/24 位,然后取最后的 8 位。
    由于 二进制的8个1 11111111 对应255。所以“取最后8位”就是& 255

    而对于将4个char转换为int,就是做相反的运算。

    完整代码如下:

    #include <iostream>
    
    //将一个int转换为4个char
    void ConvertIntTo4Char(const int IntValue, char* Chars)
    {
        Chars[0] = (IntValue >> 0) & 255;   //0~8位
        Chars[1] = (IntValue >> 8) & 255;   //8~16位
        Chars[2] = (IntValue >> 16) & 255;  //16~24位
        Chars[3] = (IntValue >> 24) & 255;  //24~32位
    }
    
    //将4个char转换位一个int
    int Convert4CharToInt(const char* Chars)
    {
        int n0 = Chars[0];      //0~8位
        int n1 = Chars[1];      //8~16位
        int n2 = Chars[2];      //16~24位
        int n3 = Chars[3];      //24~32位
        return
            (n0 << 0)           //0~8位
            + (n1 << 8)         //8~16位
            + (n2 << 16)        //16~24位
            + (n3 << 24);       //24~32位
    }
    
    int main()
    {
        int IntValue;   //实际意义为4个char的int
    
        //先将字符串转换为int
        {
            const char* encode = "yaks";            //待转换的字符串
            IntValue = Convert4CharToInt(encode);   //转换成int
        }
    
        //尝试解析int为字符串
        {
            char* result = new char[5];             //存储抓换结果,多一个char是因为要补上 \0 
            ConvertIntTo4Char(IntValue, result);    //转换为字符串
            result[4] = '\0';                       //补上 \0 
            std::cout << result << std::endl;       //打印结果
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    打印结果为

    yaks
    
    • 1

    和预期一致,因此转换是正确的。

  • 相关阅读:
    本文整理了Debian 11在国内的几个软件源。
    推荐你使用的7种实用的Java测试框架
    Java SPI 和 API,傻傻分不清?
    机器人力控:导纳控制性能受限于力矩传感器的动态特性
    22Excel
    怎样能写好年终总结报告?
    从零开始运行YOLOV5
    MySQL FLOAT、DOUBLE、DECIMAL(小数类型)
    笔记55:长短期记忆网络 LSTM
    解决SpringBoot 中Controller层加入RequestMapping导致HTML页面的静态文件路径变化问题
  • 原文地址:https://blog.csdn.net/u013412391/article/details/125404698