- 1
return ((((num & ~(0xFFFFFFFF << n)) >> (n - 0x1)) & 0x1) == 0x1) ? ((num & ~(0xFFFFFFFF << n)) ^ ~(0xFFFFFFFF << n)) + 0x1 : (num & ~(0xFFFFFFFF << n));
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+135
return ((((num & ~(0xFFFFFFFF << n)) >> (n - 0x1)) & 0x1) == 0x1) ? ((num & ~(0xFFFFFFFF << n)) ^ ~(0xFFFFFFFF << n)) + 0x1 : (num & ~(0xFFFFFFFF << n));
если я не ошибаюсь.
а выход - что то страшное
Например num = 0xFFFFFFFE, n = 8 получаем обрезок 0xFE, его старший бит один, поэтому отрицнем, и получим 0x02.
return ((minus ^ num) - minus) & ((1 << n) - 1);
как то так?
Нет. Знак нужно брать не из старшего бита всего числа, а из старшего бита обрезка. num я так понимаю знаковый, чтобы в minus попали 0x00000000 или 0xFFFFFFFF?
n-1 - знак.
Кстати, в шарпе как дела обстоят со сдвигами на число, больше либо равное разрядности (например 32-битного на 32 или 33)? Поведение определено в спеке?
Шарп не умеет в унарный минус?
> (1 << (n - 1)) - 1
А теперь при n=0 не работает.
P.S. Где-то мы тут уже обсуждали эту проблему про функци, которая бы генерила маски от 0 до 32 бит. Но что-то запамятовал, нашлось ли красивое решение, и если да, то какое.
умеет, я гоню
я же правильно думаю
num = 10100
n = 5
out = 1011 = 11
тогда при n = 1 или 0 он должен вылетать нафиг с ексепшеном)
Ага, 0 и 1 не имеют смысла, экцепшн тут вполне к месту.
h@x0r