2013-10-10 3 views
-1

У меня есть условие, которое, если Проверка наличия адреса 31 бит или нет, Вдоль стороны с я должен проверить другие addess, которые мы не support.So условие, как этоКак переписать эту проверку в C

if ((addr & (1 << 31)) || (addr == 0x000f000)) 
{ 
    printf("Not 31 bit Valid address"); 
} 

Теперь я могу переписать его как

if ((addr & (1<<31)) ? 1 : ((addr == 0x000f000) ? 1 : 0)) 

Теперь есть любой другой написать то же самое, то, что является более короче и уникальным.

+4

Первый '1 << 31' может быть определено behaviuor, записывается как' 1u << 31' –

+3

кстати '(адрес & (1u << 31) || (адр == 0x000f000)' хорошо выглядит для меня добавьте пробелы для удобочитаемости –

+6

Ваш чек выглядит отлично. Почему вы хотите переписать его на что-то запутанное? – nneonneo

ответ

9
if(addr >> 31 || addr == 0x000f000) 
+1

Это предполагает, что 'addr' - это 32-битная беззнаковая интуиция r, что может быть вероятным, но не указано в вопросе. Если он шире, дополнительные биты могут быть установлены за пределами бит 31. –

+0

Это зависит от того, на что поставлен вопрос. Это предполагает проверку адресов более 31 бит. Если это предполагается, эта проверка лучше, потому что она будет работать на 64 бит, но да, семантика отличается. – dornhege

+0

+1 для (addr >> 31), но может быть проблемой portablity, если addr изменяется от 31 бит к чему-то другому. –

0

Если addr был по крайней мере, 32-х и sizeof int было 2, следующий будет работать и будет порт хорошо.

if ((addr & 0x80000000) || (addr == 0x0000f000)) 

кодирования стиля лучше бы избежать обнаженного магических номера.

#define InvalidAddressBitMask (0x80000000) 
#define SpecialBadAddress  (0x0000f000) 
if ((addr & InvalidAddressBitMask) || (addr == SpecialBadAddress)) 
Смежные вопросы