Как мне выполнить битовые операции над структурой?

У меня есть структура битового поля, на которой я хочу выполнять побитовые операции с использованием масок. Я хочу знать самый простой и эффективный способ сделать это. Я попытался использовать мой оператор преобразования (который кажется неэффективным способом выполнения операции & на двух структурах), но я получаю ошибку C2440: "приведение типа": невозможно преобразовать из "const test::dtType" в "char". Отсутствует пользовательский оператор преобразования, который может выполнить это преобразование, или оператор не может быть вызван

class test
{
   public:
    test() : startTime(0), endTime(5,23) {}
    ~test();

    struct dtType {
        // inline constructors with initialisation lists
        dtType() {dtType(0);}
        dtType(byte z) {dtType(z,z);}
        dtType(byte n,byte h) : mins(n), hrs(h){}

        // inline overloaded operator functions
        operator char() {return mins + hrs<<3;}; // allow casting the struct as a char

        // All I want to do is return (this & hrsMask == date & hrsMask)
        // I know that in this trivial case I can do return (hrs == date.hrs) but I have simplified it for this example.
        bool operator== (dtType date){return (char(this) & char(hrsMask)) == (char(date) & char(hrsMask));};

        // data members
        unsigned mins: 3; // 10's of mins
        unsigned hrs: 5; // 8 bits
    };
    const static dtType hrsMask; // initialised outside the declaraion, since a static is not associated with an individual object.
    dtType startTime; // initialised by test() in its initialisation list
    dtType endTime; // initialised by test() in its initialisation list
};

// Typically in a source file, but can be in the header.
const test::dtType hrsMask(0,31);

Я пытался использовать пустые указатели для выполнения побитовой операции. Он компилируется, но я его не проверял.

bool test::dtType::operator== (dtType date){
    const void * longThisDT = this;
    const void * longThatDT = & date;
    const void * longMaskDT = & hrsMask;
    return (*((long *)longThisDT) &  *((long *)longMaskDT) == *((long *)longThatDT) &  *((long *)longMaskDT));
};

Это настолько эффективно, насколько мы можем получить? Он включает в себя три дополнительных указателя, когда все, что мне действительно нужно, это приведение к длинному.

2 ответа

Прежде всего, не торопитесь, чтобы подготовить РАБОЧИЙ пример, у вас много ошибок:
- тест не определен
- const test:: dtType hrsMask (0,31); неверно, должно быть: const test:: dtType test: hrsMask (0,31);

кроме того, что:
- вы должны поменять оператор char() { на оператор char () const { - это то, о чем именно скулит компилятор:)
- не должно быть байтов mins: 3 вместо unsigned mins: 3, что на самом деле означает "unsigned int", так что в любом случае используется 4 байта

Работает когда this направляется и удаляется:

bool operator== (dtType date) {
    return (char(*this) & char(hrsMask)) == (char(date) & char(hrsMask));};

/* ... */

static dtType hrsMask;

/* ... */

 test::dtType test::hrsMask(0,31);
Другие вопросы по тегам