- 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));
Lure Of Chaos 01.09.2013 19:22 # −4
kegdan 01.09.2013 20:02 # +1
если я не ошибаюсь.
а выход - что то страшное
bormand 01.09.2013 20:46 # 0
Например num = 0xFFFFFFFE, n = 8 получаем обрезок 0xFE, его старший бит один, поэтому отрицнем, и получим 0x02.
kegdan 01.09.2013 20:54 # 0
bormand 01.09.2013 21:07 # 0
EON8ight 01.09.2013 21:55 # +1
bormand 01.09.2013 21:59 # 0
kegdan 01.09.2013 22:29 # 0
return ((minus ^ num) - minus) & ((1 << n) - 1);
как то так?
bormand 02.09.2013 17:11 # 0
Нет. Знак нужно брать не из старшего бита всего числа, а из старшего бита обрезка. num я так понимаю знаковый, чтобы в minus попали 0x00000000 или 0xFFFFFFFF?
kegdan 02.09.2013 17:26 # 0
bormand 02.09.2013 17:35 # 0
n-1 - знак.
Кстати, в шарпе как дела обстоят со сдвигами на число, больше либо равное разрядности (например 32-битного на 32 или 33)? Поведение определено в спеке?
kegdan 02.09.2013 17:43 # 0
bormand 02.09.2013 17:54 # 0
kegdan 02.09.2013 17:56 # 0
bormand 02.09.2013 18:10 # 0
Шарп не умеет в унарный минус?
> (1 << (n - 1)) - 1
А теперь при n=0 не работает.
P.S. Где-то мы тут уже обсуждали эту проблему про функци, которая бы генерила маски от 0 до 32 бит. Но что-то запамятовал, нашлось ли красивое решение, и если да, то какое.
kegdan 02.09.2013 18:19 # 0
умеет, я гоню
я же правильно думаю
num = 10100
n = 5
out = 1011 = 11
тогда при n = 1 или 0 он должен вылетать нафиг с ексепшеном)
kegdan 02.09.2013 18:24 # 0
bormand 02.09.2013 18:25 # 0
Ага, 0 и 1 не имеют смысла, экцепшн тут вполне к месту.
kegdan 02.09.2013 18:34 # 0
kegdan 01.09.2013 19:48 # 0
bormand 01.09.2013 20:49 # +1
h@x0r