【问题标题】:Combining Bits - Combining Characters to Integers C++组合位 - 将字符组合成整数 C++
【发布时间】:2015-04-21 01:06:57
【问题描述】:

我对如何使文件头更有效(对于分配)有一个想法,但我想知道我是否可以执行。

是否可以从文件中读取 24 位,然后将其放入整数并保留其值?

假设我有:

00000000 00000001 00000000 = 256

我可以从一个文件中读取它,将它分成三个字符,然后将这些字符组合成一个整数,从而保留值 256 吗?这样最终的结果将是:

00000000 00000000 00000001 00000000 = 256

【问题讨论】:

  • 您将需要读取 3 个 8 位值并使用二进制算术将它们放入 32 位整数中。请澄清保留,持续时间是否仅在函数期间?在节目期间?程序退出后?
  • 在节目期间,我的意思是,对不起。至于二进制算术 - 我会移动这些值然后将这些位设置在正确的位置吗?我认为这可能会起作用。谢谢!

标签: c++


【解决方案1】:
unsigned char a, b, c;
if (f >> std::noskipws >> a >> b >> c)
{
    int n = a * 256 * 256 + b * 256 + c;
    // use n...
}
else
    std::cerr << "unable to read 3 characters from file\n";

【讨论】:

    【解决方案2】:

    试试这个:

    int combine_chars(char a, char b, char c) {
        char arr[4] = {c, b, a, '\0'};
        return *(int *)arr;
    }
    

    这是假设整数的小端表示,这意味着最低有效字节具有最小索引。基本上,该函数创建一个由 3 个字符组成的数组,其后缀为 0(因为最高有效字节是 '\0',或者最高有效 8 位是 0)。最低有效字节是c,那么由于第二个最低有效字节是示例中的1,因此变为1 &lt;&lt; 8,即256。内存中的数组是:

    c b a '\0'
    

    然后将其转换为整数指针(int *),然后将其取消引用到整数值并返回。

    【讨论】:

      【解决方案3】:

      你可以试试这样的:

      int getNumberFromStdin() {
          std::string numberStr;
          for (int i = 0; i < 3; ++i) {
              std::string s;
              std::cin >> s;
              numberStr += s;
          }
          int number = 0;
          for (const auto c : numberStr) {
              number = (number << 1) + (c - '0');
          }
          return number;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 2017-09-10
        相关资源
        最近更新 更多