заменить if в операции clip
не катит?
A = (A>255)?255:A;
ну можно. вроде у ia32 есть такая команда cmov(compare mov).
в mmx есть такие операции.
ему наверное опять для какой-то извратной архитектуры нужно =)
unsigned char tbl[2][255] = { { 0, 1, 2, 3, ..., 255 }, { 255, 255, 255, 255 ... } };
B = tbl[ bool(A & 0xFFFFFF00) ][ A & 0xFF ];
А какие бинарные операции есть?
---
...Я работаю антинаучным аферистом...
а разве bool(...) это по сути не то же самое if?
те же что и в Си
У нас A, кстати, знаковое целое или беззнаковое (судя по задаче - беззнаковое)? Если беззнаковое, то чем не устраивает просто скопировать младший (ну или старший, не знаю какая у тебя там архитектура) байт в B?
B = A >> 8) | (A >> 16) | (A >> 24 & 0xFF
B = B | (B >> 1) | (B >> 2) | ... | (B >> 7) | ( B << 1) | ... | (B << 7)
B = (B | A) & 0xFF
В случае, если "истина" представляется всеми взведёнными разрядами.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
А есть ли другие ограничения на A? Например, может быть A меньше 512?
Красиво
к сожалению ограничение на А примерно 16000
ага, это уже ближе к тому что хочется получить, правда выглядит довольно страшно
> B = B | (B >> 1) | (B >> 2) | ... | (B >> 7) | ( B << 1) | ... | (B << 7)
Обычно проверка неравенства нулю делается быстрее.
Например, с помощью сложения с переносом после вычитания из нуля.
---
...Я работаю антинаучным аферистом...
это те же if имхо, к тому же их стало в 2 раза больше
Я в ассемблере не рюхаю. Это первый алгоритм, который пришёл в голову.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
В случае, если "истина" представляется всеми взведёнными разрядами.а если истина не определена?
Разве что просто потыкаться в надежде "авось что найдётся."
---
...Я работаю антинаучным аферистом...
Для некоторых, кстати, замена вообще не имеет смысла.
---
...Я работаю антинаучным аферистом...
можно ли в таком случае на этапе компиляции узнать, чему равна истина?
то есть оно в 2 байта влезло!
нужно просто второй байт размазать до 0xFF если он не 0
если бы были циклические сдвиги то можно сделать
a |= a>>>>4
a |= a>>>>2
a |= a>>>>1
А вообще, можно запустить тестовую программу и определить.
---
...Я работаю антинаучным аферистом...
нет, не то же самое.
Оставить комментарий
pulmo
можно ли заменить if в следующей конструкции на что-то еще, какую-нибудь комбинацию сдвигов и бинарных операций?if (A > 255) B = 255; else B = A;
либо такое
if (A > 255) A = 255;
было int, столо byte и обрезалось.
A - unsigned int.