и последнее число?
getfirst(int):
mov eax, 0x20000001
.L4:
mov edx, eax
lea eax, [eax+15]
test edx, edx
cmovns eax, edx
sar eax, 4
cmp edx, 271
jg .L4
ret
Выходит намного медленнее, чем:
mov eax, 0x20000001
@@:
cmp eax, 0x10
jb @f
shr eax, 4
jmp @b
@@:
Получение последнего числа нормально сделал, через маску:
and eax, 0xF:
mov eax, 0x2000001
cdq
shr edx, 28
add eax, edx
and eax, 15
sub eax, edx
(Если что, я про HEX число - первое и последнее)
int getlast(int num) {
return (num % 0x10);
}
int getfirst(int num) {
while((num /= 0x10) > 0x10) { }
return num;
}
Bit scan точно медленнее, чем твои циклы?
Да, проверял всеми способами
Ну при маленьких значениях типа 0x20 - конечно цикл медленнее
Во втором асмолистинге ошибка тебе нужен sar
Проверял с любыми случайными значениями - нет никакой ошибки, работает
А отрицательные значения там были?
Да 0xF0001 0xE02 0xFFFFFF1 0x82918 0xFEFEFE 0xF0F0F0 Результат был: 0xF 0xE 0xF 0x8 0xF 0xF
Тогда в сишном коде не используй инты или кастуй к беззнаковым, у тебя первый листинг, явно что-то шаманит со знаком
Спасибо, тоже вот только что думал добавлять unsigned
Ты можешь делать каст внутри функции
Обсуждают сегодня