Преобразуйте массив байтов в Bitset

Да, вы можете использовать стратегию с использованием интерфейсов. Вы можете узнать это по instanceof

if (dog instanceof Dog) System.out.println("dog is an instanceof Dog");

Чтобы быть более точным в вашем вопросе, например:

public interface ISet {

    void set(int a, int b, int c);

}

public class Cube implements ISet {
    @Override
    public void set(int a, int b, int c) {

    }
}

public class Primitive implements ISet {
    @Override
    public void set(int a, int b, int c) {

    }
}


public class Tile implements ISet {
    @Override
    public void set(int a, int b, int c) {

    }
}

public static void main(String[] args) {
    ISet set = new Cube(); //just an example. it can be given
    if (set instanceof Cube) {
        System.out.println("instanceof Cube");
    }
}

public class A {
    public void set(ISet set) {
        set.set(0 ,0, 0);
    }
}
7
задан Unknown 2 April 2009 в 02:51
поделиться

4 ответа

Что-то вроде этого? (Не уверенный, если бы шаблонное волшебство работает здесь, как я ожидал бы. Я ржав в C++.)

std::bitset bytesToBitset<int numBytes>(byte *data)
{
    std::bitset<numBytes * CHAR_BIT> b;

    for(int i = 0; i < numBytes; ++i)
    {
        byte cur = data[i];
        int offset = i * CHAR_BIT;

        for(int bit = 0; bit < CHAR_BIT; ++bit)
        {
            b[offset] = cur & 1;
            ++offset;   // Move to next bit in b
            cur >>= 1;  // Move to next bit in array
        }
    }

    return b;
}
7
ответ дан 6 December 2019 в 19:42
поделиться

Существует 3-й конструктор для bitset<> - это не берет параметров и устанавливает все биты на 0. Я думаю, что необходимо будет использовать, это затем идет посредством вызова массива set() для каждого бита в массиве байтов это - 1.

Немного "в лоб", но это будет работать. Будет немного сложности для преобразования индекса байта и разрядного смещения в каждом байте к индексу bitset, но это - ничто, что определенная мысль (и возможно пробежавший под отладчиком) не решит. Я думаю, что это, скорее всего, более просто и более эффективно, чем попытка выполнить массив посредством преобразования строк или потока.

3
ответ дан 6 December 2019 в 19:42
поделиться

можно инициализировать bitset от потока. Я не могу помнить, как пререкаться байт [] в поток, но...

из http://www.sgi.com/tech/stl/bitset.html

  bitset<12> x;

  cout << "Enter a 12-bit bitset in binary: " << flush;
  if (cin >> x) {
    cout << "x =        " << x << endl;
    cout << "As ulong:  " << x.to_ulong() << endl;
    cout << "And with mask: " << (x & mask) << endl;
    cout << "Or with mask:  " << (x | mask) << endl;
  }
0
ответ дан 6 December 2019 в 19:42
поделиться

Ребята, я потратил много времени на написание обратной функции (битовый набор -> байтовый / символьный массив). Вот он:

    bitset<SIZE> data = ...

    // bitset to char array
    char current = 0;
    int offset = 0;
    for (int i = 0; i < SIZE; ++i) {
        if (data[i]) { // if bit is true
            current |= (char)(int)pow(2, i - offset * CHAR_BIT); // set that bit to true in current masked value
        } // otherwise let it to be false
        if ((i + 1) % CHAR_BIT == 0) { // every 8 bits
            buf[offset++] = current; // save masked value to buffer & raise offset of buffer
            current = 0; // clear masked value
        }
    }

    // now we have the result in "buf" (final size of contents in buffer is "offset")
2
ответ дан 6 December 2019 в 19:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: