“位运算符” 是将数据以二进制的方式进行的计算。运算符有:
&
与
|
或
^
异或
~
取反
>>
右移
<<
左移
由于数据最底层都是二进制的,因此以二进制的方式计算可以实现一些较为底层的操作。
比如某一变量是 “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
的二进制有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
和预期一致,因此转换是正确的。