2014-01-27 2 views
0

У меня есть материал, который может быть либо ГОРЯЧИМ, либо ХОЛОДНЫМ, БЕЛЫЙ или ЧЕРНЫЙ. Государства могут быть ГОРЯЧЕГО и БЕЛАЯ, ГОРЯЧАЯ и ЧЕРНАЯ, ХОЛОДНАЯ и БЕЛАЯ, ХОЛОДНАЯ и ЧЕРНАЯ. У меня есть следующий классБит-маски: задайте различные состояния объекта с помощью метода установки

class myMaterial 
    { 
    public: 
     enum state 
     { 
      DEFAULT  = 0, 
      HOT   = 1 << 0, 
      WHITE  = 1 << 1 
     }; 

     void SetState(int); 

    private: 
     int m_state; 
    }; 


    void myMaterial::SetState(int state) 
    { 
     m_state = state; 
    } 

В настоящее время в основном(), я вызываю метод SetState для установки этих состояний

myMaterial material; 
material.SetState(myMaterial::HOT); 

ли следующие битовые операции правильно, чтобы установить все типы состояний

HOT and WHITE => myMaterial::HOT | myMaterial::WHITE 
HOT and BLACK => myMaterial::HOT | ~myMaterial::WHITE 
COLD and WHITE => ~myMaterial::HOT | myMaterial::WHITE 
COLD and BLACK => ~myMaterial::HOT | ~myMaterial::WHITE 
+0

Что вы хотите достичь именно? Список типов состояний, похоже, не имеет смысла: у вас не может быть * просто * 'HOT' - бит цвета должен иметь * некоторое * значение, будь то 0 или 1. – harold

+0

Мой плохой. Я отредактировал вопрос – ontherocks

ответ

1

Номер

Используя ~ средство отрицания всех битов; который, я полагаю, не то, что вы хотите, так как это приводит к большим и большим количествам в вашем представлении (все, кроме одного единственного). У вас есть 3 состояния для каждого статуса, например, холодно, жарко и не знаю. Таким образом, вы будете нуждаться в 2 бита для них, а не 1.

Редактировать

Теперь вопрос меняется, но если мы предположим, что вы все еще есть 3 состояния для каждого бита, то вам нужно два бита. Поэтому предположим, что у вас есть COLD и HOT. Тогда:

HOT = 1 << 0; 
COLD = 1 << 1; 

И затем, если вы хотите установить переменную var в COLD, убедившись, что это не HOT, вам нужно сделать:

var = (var | COLD) // add coldness 
var = var & ~HOT // remove hotness 

или, что эквивалентно:

var = (var | COLD) & ~HOT 
+0

Просьба привести пример того, что нужно сделать. – ontherocks

+0

См. Раздел редактирования. – adrin

1

После редактирования вопрос кажется немного другим и не требует решения @ adrin от 2 бит за свойство.

Теперь это просто:

HOT and WHITE = myMaterial::HOT | myMaterial::WHITE 
HOT and BLACK = myMaterial::HOT 
COLD and WHITE = myMaterial::WHITE 
COLD and BLACK = 0 

Если добавить дополнительный бит, который говорит, известно ли государство или нет:

UNKNOWN = 0 
HOT and WHITE = myMaterial::HOT | myMaterial::WHITE | myMaterial::KNOWN 
HOT and BLACK = myMaterial::HOT | myMaterial::KNOWN 
COLD and WHITE = myMaterial::WHITE | myMaterial::KNOWN 
COLD and BLACK = myMaterial::KNOWN 
+0

Если у меня есть другое состояние, которое мне неизвестно (обозначено DEFAULT, использовано неправильное слово :(), как мне установить это? Должен ли я назначить DEFAULT отрицательное число вместо нуля? – ontherocks

+0

@ontherocks, вы можете заставить его работать с отрицательное число. Вы также можете добавить немного, чтобы сказать, известно ли состояние или нет. – harold

+0

Если я использую 'DEFAULT = 1 << 0, HOT = 1 << 1, WHITE = 1 << 2', как мне установить COLD и BLACK сейчас? Он по-прежнему будет равен нулю? – ontherocks

Смежные вопросы