C++ 将单个二进制 char 转换为 int 数字
C++ convert a single binary char to int number
我试图搜索答案,但找不到类似的问题。
我有一个字符数组,我需要在其中存储数组编号。数字只能是一个字符(不是字符串或数组中的一个索引)
例如,3 将变为 11,然后变为 char(主要是乱码)
现在我想反转这个过程,从单个字符 c,我想以十进制形式显示数字。我尝试了很多东西,但我不完全理解按位运算来查找数字。
非常感谢您的帮助!
问题是您混淆了两种不同的类型,即 int
和 char
。您不能简单地将 int
的二进制表示转换为单个 char
,因为它们使用不同数量的字节来表示它们。使用 char
,您只能表示 256 个不同的数字。
下面是我 post 的代码示例,它将 int
转换为二进制表示形式,然后再转换回 int
。
decToBin(int val, int* binaryNum)
获取一个从十进制转换为二进制的值。 binaryNum
是一个数组,用来存放结果。
binToDec(int* binaryNum)
将二进制表示转换为 int
和 returns 它
clearBinNum(int* binaryNum)
用 0 清除二进制表示
printBinNumber(int* binaryNum)
是打印二进制表示的助手
binToChar(int* binaryNum)
将二进制表示转换为 char
和 returns 它
charToDec(char charNum)
仅使用位运算将 char
转换为十进制表示形式
#include <iostream>
using namespace std;
// This is the number of bits used to
// represent an variable of type int.
int bit_pos_count = sizeof(int) * 8;
// ---------------------------------------------------------- //
void
decToBin(int val, int* binaryNum) {
int bit_pos = 0;
while (val > 0) {
if (val % 2 == 1)
binaryNum[bit_pos] = 1;
else
binaryNum[bit_pos] = 0;
val = val / 2; // integer division
++bit_pos;
}
}
// ---------------------------------------------------------- //
void
clearBinNumber(int* binaryNum) {
for (int i = 0; i < bit_pos_count; ++i)
binaryNum[i] = 0;
}
// ---------------------------------------------------------- //
void
printBinNumber(int* binaryNum) {
for (int i = bit_pos_count - 1; i >= 0; --i)
cout << binaryNum[i];
}
// ---------------------------------------------------------- //
int
binToDec(int* binaryNum) {
int result = 0;
for (int i = bit_pos_count - 1; i >= 0; --i) {
result = result << 1;
if (binaryNum[i] == 1)
result = result | 1;
}
return result;
}
// ---------------------------------------------------------- //
char
binToChar(int* binaryNum) {
int char_size = sizeof(char) * 8;
char result = 0;
for (int i = char_size - 1; i >= 0; --i) {
result = result << 1;
if (binaryNum[i] == 1)
result = result | 1;
}
return result;
}
// ---------------------------------------------------------- //
int
charToDec(char charNum) {
int char_size = sizeof(char) * 8;
char result = 0;
int compare = 1;
for (int i = 0; i < char_size; ++i) {
if ((charNum & compare) != 0)
result = result | compare;
compare = compare * 2;
}
return result;
}
// ---------------------------------------------------------- //
int
main(int argc, char const* argv[]) {
cout << bit_pos_count << endl;
int* binaryNum = new int[bit_pos_count];
// printable chars start at 33
for (int i = 33; i < 66; i += 1) {
decToBin(i, binaryNum);
char charNum = binToChar(binaryNum);
cout << "decimal: " << i << endl;
cout << "binary: ";
printBinNumber(binaryNum);
cout << endl;
cout << "decimal from binary: " << binToDec(binaryNum) << endl;
cout << "char from binary: " << charNum << endl;
cout << "decimal from char: " << charToDec(charNum) << endl;
cout << "---" << endl;
}
delete[] binaryNum;
}
decimal: 33
binary: 00000000000000000000000000100001
decimal from binary: 33
char from binary: !
decimal from char: 33
---
decimal: 34
binary: 00000000000000000000000000100010
decimal from binary: 34
char from binary: "
decimal from char: 34
---
decimal: 35
binary: 00000000000000000000000000100011
decimal from binary: 35
char from binary: #
decimal from char: 35
---
我试图搜索答案,但找不到类似的问题。 我有一个字符数组,我需要在其中存储数组编号。数字只能是一个字符(不是字符串或数组中的一个索引)
例如,3 将变为 11,然后变为 char(主要是乱码)
现在我想反转这个过程,从单个字符 c,我想以十进制形式显示数字。我尝试了很多东西,但我不完全理解按位运算来查找数字。 非常感谢您的帮助!
问题是您混淆了两种不同的类型,即 int
和 char
。您不能简单地将 int
的二进制表示转换为单个 char
,因为它们使用不同数量的字节来表示它们。使用 char
,您只能表示 256 个不同的数字。
下面是我 post 的代码示例,它将 int
转换为二进制表示形式,然后再转换回 int
。
decToBin(int val, int* binaryNum)
获取一个从十进制转换为二进制的值。binaryNum
是一个数组,用来存放结果。binToDec(int* binaryNum)
将二进制表示转换为int
和 returns 它clearBinNum(int* binaryNum)
用 0 清除二进制表示
printBinNumber(int* binaryNum)
是打印二进制表示的助手binToChar(int* binaryNum)
将二进制表示转换为char
和 returns 它charToDec(char charNum)
仅使用位运算将char
转换为十进制表示形式
#include <iostream>
using namespace std;
// This is the number of bits used to
// represent an variable of type int.
int bit_pos_count = sizeof(int) * 8;
// ---------------------------------------------------------- //
void
decToBin(int val, int* binaryNum) {
int bit_pos = 0;
while (val > 0) {
if (val % 2 == 1)
binaryNum[bit_pos] = 1;
else
binaryNum[bit_pos] = 0;
val = val / 2; // integer division
++bit_pos;
}
}
// ---------------------------------------------------------- //
void
clearBinNumber(int* binaryNum) {
for (int i = 0; i < bit_pos_count; ++i)
binaryNum[i] = 0;
}
// ---------------------------------------------------------- //
void
printBinNumber(int* binaryNum) {
for (int i = bit_pos_count - 1; i >= 0; --i)
cout << binaryNum[i];
}
// ---------------------------------------------------------- //
int
binToDec(int* binaryNum) {
int result = 0;
for (int i = bit_pos_count - 1; i >= 0; --i) {
result = result << 1;
if (binaryNum[i] == 1)
result = result | 1;
}
return result;
}
// ---------------------------------------------------------- //
char
binToChar(int* binaryNum) {
int char_size = sizeof(char) * 8;
char result = 0;
for (int i = char_size - 1; i >= 0; --i) {
result = result << 1;
if (binaryNum[i] == 1)
result = result | 1;
}
return result;
}
// ---------------------------------------------------------- //
int
charToDec(char charNum) {
int char_size = sizeof(char) * 8;
char result = 0;
int compare = 1;
for (int i = 0; i < char_size; ++i) {
if ((charNum & compare) != 0)
result = result | compare;
compare = compare * 2;
}
return result;
}
// ---------------------------------------------------------- //
int
main(int argc, char const* argv[]) {
cout << bit_pos_count << endl;
int* binaryNum = new int[bit_pos_count];
// printable chars start at 33
for (int i = 33; i < 66; i += 1) {
decToBin(i, binaryNum);
char charNum = binToChar(binaryNum);
cout << "decimal: " << i << endl;
cout << "binary: ";
printBinNumber(binaryNum);
cout << endl;
cout << "decimal from binary: " << binToDec(binaryNum) << endl;
cout << "char from binary: " << charNum << endl;
cout << "decimal from char: " << charToDec(charNum) << endl;
cout << "---" << endl;
}
delete[] binaryNum;
}
decimal: 33
binary: 00000000000000000000000000100001
decimal from binary: 33
char from binary: !
decimal from char: 33
---
decimal: 34
binary: 00000000000000000000000000100010
decimal from binary: 34
char from binary: "
decimal from char: 34
---
decimal: 35
binary: 00000000000000000000000000100011
decimal from binary: 35
char from binary: #
decimal from char: 35
---