Невозможно извлечь грызть слово

Я пытаюсь извлечь 4-битную из 16-битной двоичной строки, то есть грызет слово. Может кто-нибудь сказать мне, что не так с этой программой?

#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

5 ответов

Решение

Если вы манипулируете string, вы должны использовать substr, а не техника "сдвига и маски": & а также >> операторы не определены для строк и 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

Демо на 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);

У тебя есть std::string объект, который содержит 16 символов, каждый со значением '0' или же '1', Если вы хотите посмотреть на "отрывки", взятые оттуда, просто выделите группы из 4 символов, которые вам нужны:

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

Это просто текстовые манипуляции; если вы хотите получить значения, просто (и полезное упражнение) конвертировать символы в digit0 в числовое значение..

Вы не можете преобразовать целое число в строку так, как вы это делаете. Вы можете использовать stringstream:

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

Прежде чем использовать вышеописанную функцию, вам нужно прочитать целые числа из частей входной строки. Проблема в том, что побитовые операции не определены в строке.

Тип aBinaryIPAddress должен быть числом, а не строкой

что-то вроде

unsigned int aBinaryIPAddress = 0b1100110011001100;

должно сработать

Очевидно, что проблема заключается в таких утверждениях

std::string digit0 = aBinaryIPAddress & 0x0f;

Ты понимаешь, что std::string не число?!

Другие вопросы по тегам