Программирование : Вопрос 1 : 17

Заменить вычисление вида:

if (value > 0xFF) value = 0xFF; 
else if (value < 0) value = 0; 

на выражение, не содержащее операторы условий. Размер value 4 байта.

 

Уважаемые учащиеся ниже Вы сможете увидеть ответ, перед тем, как ответить, пожалуйста, постарайтесь написать для себя ответ на черновике, и только потом сравните наш ответ с Вашим: 

 

Верно ли наше решение?

Ответ:

value = (((((value << 23) >> 31) | value) & 0xFF) & ~(value >> 31)) & 0xFF; 

Рассмотрим вычисления для трех случаев:
1) значение положительное не больше 1 байта
2) положительное и больше 1 байта
3) отрицательное

(value << 23) 

Для 1) будет просто сдвиг бит. Для 2) при сдвиге первый бит встанет на бит знака и значение становится отрицательным. Для 3) обычный сдвиг, значение остаётся отрицательным

((value << 23) >> 31) 

Для 1) всегда будет нулевое значение
Для 2) и 3) все биты будут заполнены 1, т.к. при сдвиге вправо отрицательного числа, биты сдвигаются и бит знака заново устанавливается в 1

((((value << 23) >> 31) | value) & 0xFF) 

Для 1) будет value
Для 2) и 3) будет 0xFF

& ~(value >> 31) 

Для 1) и 2) положительных значений все биты будут все 1
Для 3) отрицательное будет 0
1 балл


© Copyright © 2017 - 2019 Все права защищены. Бесплатное онлайн образование.