Как найти TMax без использования смен

Использование ТОЛЬКО

! ~ & ^ | + 

Как узнать, является ли 32-разрядное число TMax?

TMax – это максимум, номер дополнения к нему.

Мои мысли до сих пор были:

 int isTMax(int x) { int y = 0; x = ~x; y = x + x; return !y; } 

Это всего лишь одна из многих вещей, которые я безуспешно пробовал, но я просто не могу думать о собственности TMax, которая вернет мне TMax. Как добавление tmax к себе было бы уникальным по сравнению со всеми другими целыми числами.


Вот настоящая проблема:

 /* * isTMax - return 1 if x is the maximum, two's complement number, * and 0 return otherwise. * Legal ops: ! ~ & ^ | + * Max ops: 10 * Rating: 1 */ int isTMax(int x) { int y = 0; x = ~x; y = x + x; return !y; } 

int – 32 бита, поэтому максимальная подпись, вероятно, будет 0x7FFFFFFF

    Что-то вроде этого возможно? 0x7FFFFFFF – это максимальное число положительных подписей 32-битного двоичного номера.

     int isTMax(int x){ return !(x ^ 0x7FFFFFFF); } 

    Я не уверен, вам может потребоваться отдать его без знака, чтобы он работал.

    Насколько я знаю, нет способа определить, является ли конкретное значение максимальным значением подписанного типа, не зная максимального значения этого типа и прямого сравнения. Это связано с тем, что подписанные выражения испытывают неопределенное поведение при переполнении. Если бы был ответ на ваш вопрос, это означало бы существование ответа на серьезную нерешенную проблему, которая в течение некоторого времени плавала вокруг SO: как программно определить максимальное значение для данного подписанного типа.

     int isTmax(int x) { //add one to x if this is Tmax. If this is Tmax, then this number will become Tmin //uses Tmin = Tmax + 1 int plusOne = x + 1; //add to x so desired input becomes 0xFFFFFFFF, which is Umax and also -1 //uses Umax = 2Tmax + 1 x = x + plusOne; plusOne = !(plusOne); //is x is 0xffffffff, then this becomes zero when ~ is used x = ~x; x = x | plusOne; x = !x; return x; } 
     #include  #include  int test(int n) { return !(n & 0x80000000) & !~(n | (n + 1)); } // or just effectively do a comparison int test2(int n) { return !(n ^ 0x7fffffff); } int main(int ac, char **av) { printf("is%s TMax\n", test(atoi(av[1])) ? "" : " not"); return 0; } 

    если это Tmax: 011111 …..

    то мы хор с 10000 ….

    мы получаем 11111 ….

    то мы ~ получаем все 0s = 0,! 0, получаем 1:

     int isTmax(int x) { return !(~((1 << 31) ^ x )); }