Цитата(IgorKossak @ Sep 28 2010, 20:20)

Как определён Ваш PIND?
Он не мой - это регистр ввода с порта.
Цитата(777777 @ Sep 28 2010, 20:53)

PIND равен 00001110. После инвертирования получится 11110001. А если учесть, что компилятор в выражениях расширяет операнды до int, то единиц будет еще больше. Ну и сдвиг на 4 с расширением знака даст все единицы, причем в обоих случаях. Как у тебя получилось что-то другое - хз
Ничего что у меня сначала инверсия, потом сдвиг? Или раскрывать скобки уже не обязательно?
Код
temp = PIND;
temp = ~temp;
SomeVar = temp >> 4;
Работает адекватно.
Цитата(IgorKossak @ Sep 28 2010, 21:35)

Под ???? подразумевались недостающие четыре бита?
Любые биты, в данном случае не имеющие значения и ничего не меняющие.
Цитата(rezident @ Sep 28 2010, 21:35)

Нормальные компиляторы на такой оператор выдают предупреждение или ремарку. Например, IAR "ругается" таким образом
Если уж приспичило писать именно так, а не другим способом инвертировать биты, то наложите байтовую маску после инвертирования, но до сдвига.
И что мне это даст?
Гораздо проще
Код
((~PIND) >> 4) & 0xf;
Но вопрос в другом - мне казалось что сначала должна была быть инверсия, потом сдвиг. Я не прав? Или данная конструкция что-то нарушает и не может быть применена?