2010-06-23 2 views
2
#define OUTGOING_MASK   0x0c 
#define OUTGOING_DISABLED  0x04 
#define OUTGOING_ENABLED  0x08 
#define OUTGOING_AUTO   0x00 
#define REFER_SUPPORTED  0x80 

Предполагается, что support - некоторое значение типа int. У меня есть функция чтенияПобитовая установка в C++

int get() 
{ 
if(OUTGOING_DISABLED == support & OUTGOING_MASK) 
return 1; 
else if(OUTGOING_ENABLED == support & OUTGOING_MASK) 
return 2; 
else if(OUTGOING_AUTO == support & OUTGOING_MASK) 
return 3; 
} 

Мне нужно написать набор функций для этого, как

void set(int val) 
{ 
if(val ==1) 
//todo 
else if(value == 2) 
//todo 
else if(value == 3) 
//todo 
} 

Как написать методы получения и установки функций для этого? Мне нужно установить/установить переменную support здесь

REFER_SUPPORTED всегда будет установлен в support.

+0

б еще содержит значение б даже после заявления. Что вы хотите сделать со значением b? Вывести значение b? – progrmr

+0

Учитывая, что a2 и a1 равны b & a2, вы хотите восстановить значение b? – Donotalo

+0

Есть ли причина, по которой вы возвращаете 1,2,3 вместо OUTGOING_DISABLED, OUTGOING_ENABLED и OUTGOING_AUTO? –

ответ

6

У меня есть инструкция, такая как a1 = b & a2; Как узнать значение b с помощью побитовых операторов?

Вы не можете восстановить значение b, если только a не имеет ВСЕ бит. «&» является необратимым.

Объяснение. & операция имеет следующую таблицу:

a b result 
1 & 1 = 1 
0 & 1 = 0 
1 & 0 = 0 
0 & 0 = 0 

значит, восстановить Ь, вы можете попробовать использовать следующую таблицу:

a result b 
0 0  unknown - could be 1 or 0 
0 1  invalid/impossible - could not happen 
1 0  0 
1 1  1 

Как вы можете видеть, что это не возможно угадать б во всех случаях ,

В выражении a & b = c, если вы знаете c и a, вы не можете восстановить b, потому что для каждого нулевого бита c и если соответствующий бит a также равен нулю, возможны два возможных состояния соответствующие биты b. Вы можете надежно восстановить б только тогда, когда каждый бит установлен в 1.

3

У вас нет. В общем, вы не можете восстановить эту информацию только a1 и a2. Чтобы увидеть это, рассмотрите случай a2 == 0. b & 0 всегда 0.

+0

Спасибо, Мэтью. В моем коде a2 никогда не может быть равным нулю. Это будет 3 или 4 в целом. В таком случае, как это сделать? Но a1 может быть нулевым – Sunil

+0

Вы все еще не можете. '8 & 3' и' 4 & 3' равны 0, чтобы привести пример. –

+0

Все еще не может быть сделано. Почему вы чувствуете, что вам это нужно? – Artelius

1

Вы можете использовать следующий код, чтобы распечатать двоичный эквивалент

void printBit(int n) 
{ 
    unsigned int i; 
    i = 1<<(sizeof(n) * 8 - 1); 

    while (i > 0) 
    { 
    if (n & i) 
    { 
     printf("1"); 
    } 
    else 
    { 
     printf("0"); 
    } 
    i >>= 1; 
} 
} 

Это было бы просто распечатать двоичный эквивалент «B». Это то, что вы хотите сделать?

+0

Нет. Я не хочу бинарного эквивалента b. Я просто хочу значение b – Sunil

+0

Я думаю, вам нужно быть более понятным, что вы подразумеваете под «значением». – IntelliChick

2

ли после того, что вы хотите:

void set(int val) 
{ 
    support &= ~OUTGOING_MASK; 
    support |= REFER_SUPPORTED; 

    if(val == 1) 
    { 
     support |= OUTGOING_DISABLED; 
    } 
    else if(value == 2) 
    { 
     support |= OUTGOING_ENABLED; 
    } 
    else if(value == 3) 
    { 
     support |= OUTGOING_AUTO; 
    } 
} 

Если это так, то я полагаю, вы добытчика функцию также неправильно. По моему разумению, это должно быть следующим:

int get() 
{ 
    if(OUTGOING_DISABLED == ((support & OUTGOING_MASK) >> 2)) 
     return 1; 
    else if(OUTGOING_ENABLED == ((support & OUTGOING_MASK) >> 2)) 
     return 2; 
    else if(OUTGOING_AUTO == ((support & OUTGOING_MASK) >> 2)) 
     return 3; 
} 

+0

Да ... но у меня есть еще один номер #define REFER_SUPPORTED 0x80 , который всегда будет установлен в поддержку – Sunil

+0

Пожалуйста, уточните мой обновленный ответ. Раньше я был не прав. – Donotalo

+0

Спасибо. можете ли вы написать геттер также в соответствии с установщиком. – Sunil

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