Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Побитовое отрицание


Автор: Rudolf 17.12.2009, 11:24
Возник вопрос по использованию оператора ~, когда я его применяю допустим к 5, то должно получится 2, но получается -6, т.е. int j=5;j=~j; и j в итоге равно -6, подскажите пожалуйста как это исправить.

Автор: t_gran 17.12.2009, 11:49
А почему вы забываете про остальные биты? Это инверсия integer (4 байта или 16 бит), что в результате получается:
Код

00000000000000000000000000000101 -> 11111111111111111111111111111010

11111111111111111111111111111010 == -6 ==  4294967290

Автор: Rudolf 17.12.2009, 11:54
А каким образом их можно урезать?

Автор: UniBomb 17.12.2009, 12:01
Тут дело в том, что int имеет разрядность 16 бит, поэтому твое исходное число не 101(2), а 0000000000000101(2). И когда ты применяешь ~, то у тебя получается число 1111111111111010(2). А так как int у тебя знаковый, то в соответствии с правилами кодирования чисел и получается -6.

Соответственно тебе надо во-первых использовать беззнаковый тип данных, а во-вторых обнулять все "ненужные" биты. Те вот так:

Код

int j=5;
j=(~j)&0x0007;


upd чорд, опередили  smile 

Автор: Rudolf 17.12.2009, 12:03
Ясно, спасибо за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)