C++ 将单个二进制 char 转换为 int 数字

C++ convert a single binary char to int number

我试图搜索答案,但找不到类似的问题。 我有一个字符数组,我需要在其中存储数组编号。数字只能是一个字符(不是字符串或数组中的一个索引)

例如,3 将变为 11,然后变为 char(主要是乱码)

现在我想反转这个过程,从单个字符 c,我想以十进制形式显示数字。我尝试了很多东西,但我不完全理解按位运算来查找数字。 非常感谢您的帮助!

问题是您混淆了两种不同的类型,即 intchar。您不能简单地将 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
---