栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学习在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 相当于将A和B都转换为二进制,然后对于每一位都进行 与 操作。

比如:

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

将会输出

516

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

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

可以看出,对于每一位:仅在789和654在那一位上的数都是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 

//将一个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是因为要补上  
        ConvertIntTo4Char(IntValue, result);    //转换为字符串
        result[4] = '';                       //补上  
        std::cout << result << std::endl;       //打印结果
    }
}

打印结果为

yaks

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982348.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号