IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 学习在C++中使用位运算符做“int”和“4个char”之间的转换 -> 正文阅读

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

位运算符

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

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

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

>> 的例子

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

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

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

将会输出:

1000

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

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

将会输出:

197

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

& 的例子

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

比如:

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

将会输出

516

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

1100010101 (789)
1010001110 (654)
1000000100 (516)

可以看出,对于每一位:仅在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;       //打印结果
    }
}

打印结果为

yaks

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-26 16:45:42  更:2022-06-26 16:46:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:51:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码