【问题标题】:Unable to extract nibbles out of a word无法从单词中提取半音
【发布时间】:2013-11-05 14:09:38
【问题描述】:

我正在尝试从 16 位二进制字符串中提取 4 位,即从一个单词中剔除 谁能告诉我这个程序有什么问题?

#include <sstream>
#include <iomanip>
#include <math.h>
#include<iostream>

using namespace std;

int main()
{
    std::string aBinaryIPAddress = "1100110011001100";

    std::string digit0 = aBinaryIPAddress & 0x0f;
    cout << "digit0 : " << digit0 << endl;

    std::string digit1 = (aBinaryIPAddress >>  4) 0x0f;
    cout << "digit1 : " << digit1 << endl;

    std::string digit2 = (aBinaryIPAddress >>  8) 0x0f;
    cout << "digit2 : " << digit2 << endl;

    std::string digit3 = (aBinaryIPAddress >> 12) 0x0f;
    cout << "digit3 : " << digit3 << endl;

    return 0;
}

我收到以下错误:

 changes.cpp: In function `int main()':
 changes.cpp:117: error: invalid operands of types `char*' and `int' to binary `
 operator>>'
 changes.cpp:117: error: parse error before numeric constant

【问题讨论】:

  • 尝试使用std::bitset 或二进制文字。
  • 是什么让您认为您可以在 std::string 上执行整数位运算?
  • aBinaryIPAddress 不是二进制字符串。它是一个字符串。
  • @akonsu:不仅如此,它还是一个封装了字符串抽象的对象。
  • @LightnessRacesinOrbit 那么,我应该使用什么?

标签: c++ type-conversion word nibble


【解决方案1】:

如果您正在操作 string,则应该使用 substr,而不是“移位和掩码”技术:&amp;&gt;&gt; 运算符未定义用于字符串和 ints。

这里是使用substr的方法:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string aBinaryIPAddress = "0101100111101101";
    size_t len = aBinaryIPAddress.size();
    for (int i = 0 ; i != 4 ; i++) {
        cout << "Digit " << i << ": " << aBinaryIPAddress.substr(len-4*(i+1), 4) << endl;
    }
    return 0;
}

打印出来

Digit 0: 1101
Digit 1: 1110
Digit 2: 1001
Digit 3: 0101

Demo on ideone.

如果您需要四个单独的变量,“展开”循环,如下所示:

string d0 = aBinaryIPAddress.substr(len-4, 4);
string d1 = aBinaryIPAddress.substr(len-8, 4);
string d2 = aBinaryIPAddress.substr(len-12, 4);
string d3 = aBinaryIPAddress.substr(len-16, 4);

【讨论】:

  • 感谢这个家伙,但我有一组二进制字,即 16 位数字存储在 128 位左右的 char 指针中
  • 所以对于每个单词我需要提取一个半字节,不可能在每个单词上使用子字符串
  • @Prats 为什么不呢?从您的char* 中创建一个string(假设格式正确),然后继续使用substr
  • 每次从单词中提取时,我如何将这些 digit0、digit1、digit3、.. 中的每一个转换为变量,我需要对这些半字节进行进一步的计算。
  • @Prats 然后不要倒退(即substr(len-4, 4)substr(len-8, 4),...)你会前进(即substr(0, 4)substr(4, 4)substr(12, 4),等等上)。
【解决方案2】:

您不能按照您的方式将整数转换为字符串。您可以使用字符串流:

#include <iomanip>
......
std::string convert_int_to_hex_stiring(int val) {
  std::stringstream ss;
  ss << std::hex << val;
  return val;
}

在使用上述函数之前,您必须从输入字符串的某些部分中读取整数。问题是未在字符串上定义按位运算。

【讨论】:

    【解决方案3】:

    aBinaryIPAddress 的类型应该是数字而不是字符串

    类似

    unsigned int aBinaryIPAddress = 0b1100110011001100;
    

    应该工作

    【讨论】:

    • 不起作用,出现以下错误:错误:从 'unsigned int' 到 'const char*' 的无效转换 [-fpermissive]
    • digit0123的类型也要改一下
    【解决方案4】:

    您有一个包含 16 个字符的 std::string 对象,每个字符的值都为 '0''1'。如果您想查看从那里获取的“nibbles”,只需拉出您需要的 4 字符组:

    std::string digit0 = aBinaryIPAddress.substr(12,4);
    std::cout << digit0 << '\n';
    

    这只是文本操作;如果您想获取值,将digit0 中的字符转换为数值很简单(也是一个有用的练习)。..

    【讨论】:

      【解决方案5】:

      很明显,问题出在这样的陈述中

      std::string digit0 = aBinaryIPAddress & 0x0f;
      

      你明白 std::string 不是数字吗?!

      【讨论】:

      • 是的,我知道字符串不是数字,而是如何使用它来提取半字节
      猜你喜欢
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      相关资源
      最近更新 更多