【问题标题】:C++ convert a single binary char to int numberC++ 将单个二进制 char 转换为 int 数字
【发布时间】:2021-07-29 08:53:45
【问题描述】:

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

例如,3 会变成 11,然后变成 char(大部分是乱码)

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

【问题讨论】:

  • int i = static_cast<int>(c);?
  • 你能展示一些示例输入和预期输出吗?看起来你的代码只是代表一个整数并将它们存储在一个字符中
  • 我认为您在这里对值及其表示感到困惑。 int 没有“十进制形式”或类似的东西。它有一个,该值可以使用二进制、十进制、十六进制等表示。您提供的循环可以替换为c = <source_int>;,您可以执行以下操作与另一个 int 变量相同。
  • 既然已经有办法了,为什么还要做事过度??
  • @ME-ON1 这不是很明显吗?因为 OP 还在学习,缺少内部和外部表示的关系。我相信我们过去或多或少都有过这个 Heureka 时刻......

标签: c++ bitwise-operators


【解决方案1】:

问题是您混淆了两种不同的类型,即intchar。您不能简单地将int 的二进制表示转换为单个char,因为它们使用不同数量的字节来表示它们。使用char,您只能表示 256 个不同的数字。

下面我发布了一个代码示例,它将int 转换为二进制表示,然后再转换为int

  • decToBin(int val, int* binaryNum) 获取从十进制转换为二进制的值。 binaryNum 是存储结果的数组。
  • binToDec(int* binaryNum) 将二进制表示转换为 int 并返回它
  • clearBinNum(int* binaryNum) 用 0 清除二进制表示
  • printBinNumber(int* binaryNum) 是打印二进制表示的助手
  • binToChar(int* binaryNum) 将二进制表示转换为 char 并返回它
  • 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
---

【讨论】:

  • @JohnFilleau:因为char 可能只有签名/未签名0-128 是安全的;在 C++20 之前,超出此范围(用于转换)的值将由实现定义...
  • @Jarod C++ Fundamental Types“对于范围 [0, 255] 内的每个 unsigned char 类型的值,将值转换为 char 然后再转换回 unsigned char 会产生原始值。(从 C++11)".虽然表示可以与signedunsigned char 相同,但看起来char 仍然能够表示unsigned char 的完整unsigned char 范围[0, 255]
  • @JohnFilleau:我认为你是对的。我查看了一个包含 127 个条目的 ASCII 表。但是 char 的大小为 1 个字节,即 8 位。 2^8 = 256。我相应地编辑了文本。
猜你喜欢
  • 2014-05-27
  • 2014-11-28
  • 1970-01-01
  • 2016-05-12
  • 2019-03-18
  • 2010-12-20
  • 2012-02-24
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多