Да, вы можете использовать стратегию с использованием интерфейсов. Вы можете узнать это по 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);
}
}
Что-то вроде этого? (Не уверенный, если бы шаблонное волшебство работает здесь, как я ожидал бы. Я ржав в 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;
}
Существует 3-й конструктор для bitset<>
- это не берет параметров и устанавливает все биты на 0. Я думаю, что необходимо будет использовать, это затем идет посредством вызова массива set()
для каждого бита в массиве байтов это - 1.
Немного "в лоб", но это будет работать. Будет немного сложности для преобразования индекса байта и разрядного смещения в каждом байте к индексу bitset, но это - ничто, что определенная мысль (и возможно пробежавший под отладчиком) не решит. Я думаю, что это, скорее всего, более просто и более эффективно, чем попытка выполнить массив посредством преобразования строк или потока.
можно инициализировать 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;
}
Ребята, я потратил много времени на написание обратной функции (битовый набор -> байтовый / символьный массив). Вот он:
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")