Здравствуйте, Слава, Вы писали:
С>Здравствуйте, tyomchick, Вы писали:
T>>Есть ли какой то быстрый способ проверить, что целое число в шестнадцатеричном представлении содержит только десятичные цифры?
С>Есть. Двигать вправо, читать по 4 битика и проверять — не больше ли они, чем 9.
Ну это "в лоб", я думал может какая битовая магия есть.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Здравствуйте, tyomchick, Вы писали:
С>>Есть. Двигать вправо, читать по 4 битика и проверять — не больше ли они, чем 9.
T>Ну это "в лоб", я думал может какая битовая магия есть.
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, tyomchick, Вы писали:
С>>>Есть. Двигать вправо, читать по 4 битика и проверять — не больше ли они, чем 9.
T>>Ну это "в лоб", я думал может какая битовая магия есть.
W>Типа такой, что ли?
Здравствуйте, tyomchick, Вы писали: T>Здравствуйте, Alexander G, Вы писали:
AG>> if ( (possible_non_bcd >> 2) & val )
AG>> return false; // A, B
AG>>
T>Выглядит хорошо, но работает сильно медленнее простой проверки тетрад.
А как проверял? А то может тут просто компилятор недостаточно умный и у него не получилось свернуть три return в один. Из-за этого, например, остались условные переходы, которые из-за особенностей тестовых данных могут плохо предсказываться. Не то чтобы от такого объяснения решение стразу стало лучше, но интересно, если немного помочь компилятору и чуть-чуть переписать вышеприведённый код в таком виде, то что-нибудь существенно изменится?
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, tyomchick, Вы писали: T>>Здравствуйте, Alexander G, Вы писали: W>
AG>>> if ( (possible_non_bcd >> 2) & val )
AG>>> return false; // A, B
AG>>>
T>>Выглядит хорошо, но работает сильно медленнее простой проверки тетрад.
W>А как проверял? А то может тут просто компилятор недостаточно умный и у него не получилось свернуть три return в один. Из-за этого, например, остались условные переходы, которые из-за особенностей тестовых данных могут плохо предсказываться. Не то чтобы от такого объяснения решение стразу стало лучше, но интересно, если немного помочь компилятору и чуть-чуть переписать вышеприведённый код в таком виде, то что-нибудь существенно изменится?
Проверял я на С# .
Просто проверка чисел от 0 до 10^9
W>
; C++
mov eax, edi
and eax, -2004318072
mov edx, eax
shr eax, 2
shr edx
or eax, edx
test eax, edi
sete al
ret
; JIT x86
mov edx, ecx
and edx, 0x88888888
mov eax, edx
shr eax, 1
shr edx, 0x2
or eax, edx
and eax, ecx
setz al
movzx eax, al
ret