2013-05-18 5 views
0

Я просто хочу обратить двоичные значения целого числа с помощью NOT (~) оператора, но когда я делал, как этотОбратное значение с помощью Не Оператора

struct rev 
{ 
     unsigned i:3; //for only 3 bits means 000 to 111 
}; 
r.i = 5; 

printf(" Reverse of %d = %u \n",r.i,~(r.i)); 

он дает мне Reverse of 5 = 4294967290

, но я хочу Reverse of 5 = 2 потому что я использую 3 бита, поэтому, если я сделаю его НЕ, то 5 будет изменен на 2, но он не показывался, как это, он давал мне результат fffffffa. Я не знаю почему.

Значит, что я хочу, это обмен 1 и 0 только через оператор NOT. я хочу

0 - 7 
1 - 6 
2 - 5 

... как это.

Спасибо.

+0

Существует нет беззнакового: 3 типа в C, поэтому ~ r.i не собирается только инвертировать 3 бита. –

+0

то как инвертировать только 3 бита ??? – goodies

+0

И сям, и Мэтт уже дали вам ответы. Вы можете не только инвертировать 3 бита, но вы получите эквивалент путем маскировки или усечения. –

ответ

4

Хотя сохраненное значение i составляет 3 бита, при использовании его для расчетов в C или C++, он получает полный размер (в этом случае 32 бита).

Вы можете решить ее:

rev r; 
rev s; 

r.i = 5; 
s.i = ~r.i; 

printf(" Reverse of %d = %u \n",r.i,s.i); 

Edit: Вы можете написать класс, который обеспечивает uint3:

class uint3 
{ 
    private: 
    unsigned val; 
    enum { mask = 7; }; 
    public: 
    uint3(unsigned int v = 0) { val = v & mask; } 
    uint3 operator=(uint3 v) { val = v.val; return *this; } 
    operator int() { return val; } 
}; 

uint3 operator~(uint3 v) { return uint3(~(int)v); } 

uint3 r = 5; 
printf(" Reverse of %d = %u \n",(int)r, (int(~r))); 

Я не компилируется выше, но что-то вдоль этих линий.

+0

это нормально, но зачем нам нужна вторая структура? – goodies

+3

Используя вторую структуру, мы принудительно возвращаем результат в виде 3-битного. В противном случае он станет 32-битным, инвертирующим исходное 3-битное значение. –

+0

Есть ли какой-либо другой способ заставить результат быть сохраненным в 3 бита ?? – goodies

1

operator~ отменяет все биты вашего значения unsigned (как правило, 32-битное целое число).

Чтобы ограничить это 3 бита, которые необходимо побитовое and операцию для того, чтобы применить битовую маску:

~variable & 7 
+0

, но у нас нет оператора, чтобы просто отменить биты, то почему мы делаем это И с 7. – goodies

+0

, и если у меня будет 'unsigned i: 5', то снова мы должны изменить это значение .. – goodies

+2

@goodies: 'operator ~' не может работать только с 3 (или 5) битами, чтобы работать, он должен использовать полное целое число. Если вы планируете изменить размер битового поля, вы можете использовать решение MatPetersson (сохранение повышаемого значения обратно в вашу структуру заставляет «и» под капотом) или определить статическую константу для битовой маски в той же самой структуре, чтобы вы не У вас есть магические значения (например, 7), лежащие повсюду в вашем коде. – syam

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