Предполагая, что 2 дополнения, ваша оригинальная идея проверить, что все старшие, но 15 битов - все 0 или все 1. Работает.
11111111 11111111 1xxxxxxx xxxxxxxx /* for negative 16 bits int */
00000000 00000000 0xxxxxxx xxxxxxxx /* for positive 16 bits int */
Принимая арифметическое смещение вправо, вы можете сместить вправо на 15, чтобы устранитьнеизвестные биты, тогда останутся только 1 с или 0 (если он умещается в 15 битах)
Таким образом, тогда x>>15
должно быть либо 0, либо -1.
Если это 0, то! (x>> 15) верно.
Если оно равно -1, то! (~ (X >> 15)) верно.
Таким образом, вы можете проверить !(x>>15) | !(~(x>>15))
Или вы также можете написать это так: !(x>>15) | !(~x>>15)
Обратите внимание, что вышеприведенные выражения не предполагают 32 бита x, а также будут работать для тестирования, если int64 поместится в int16 ...
. Есть много других способов...
Поскольку вы также можете использовать +, (x>>15)+1
равен 0 или 1.
Затем вы можете очистить последний бит с помощью: ((x>>15)+1)>>1
.
x
вписывается в 16-битное int, если выражение вышевсе 0 (ложь), поэтому вы хотите:
! (((x>>15)+1)>>1)
До вас, чтобы найти больше выражений ...