Посл.ответ |
Сообщение |
Ранг: 756.3 (! !), 113thx Активность: 0.61↘0.05 Статус: Участник Student
|
Создано: 08 ноября 2010 00:31 · Личное сообщение · #1
Как вычислить сколько знаков в десятичном целом числе, используя только сдвиги и логические операции?
----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh | Сообщение посчитали полезным: |
|
Ранг: 29.9 (посетитель), 9thx Активность: 0.02↗0.06 Статус: Участник
|
Создано: 08 ноября 2010 01:34 · Поправил: [X-Ray] · Личное сообщение · #2
DWORD d = any_you_like; int i = 0; if (d > 0xFFFFFF) i--; //если d>16777215, то от результата отнимать единицу, хз почему while (d>0) { d >>= 3; // d shr 3 i++; } printf("count=%d", i); Edit мда, кодес косячный получился
| Сообщение посчитали полезным: |
Ранг: 101.0 (ветеран), 344thx Активность: 1.15↘0 Статус: Участник
|
Создано: 08 ноября 2010 01:53 · Личное сообщение · #3
[X-Ray] пишет: хз почему лол) это вообще бред, весь код: #define i_want_9 9 d = i_want_9; /////////////////// i = 0 d = 1 i = 1 d = 0 i = 2
| Сообщение посчитали полезным: |
Ранг: 756.3 (! !), 113thx Активность: 0.61↘0.05 Статус: Участник Student
|
Создано: 08 ноября 2010 01:56 · Поправил: Isaev · Личное сообщение · #4
[X-Ray] Сдвигать триадами? Я бы поверил, что это работает, если бы речь шла о восьмеричной СС но я попробую завтра... int не понял твой код вообще
----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh | Сообщение посчитали полезным: |
Ранг: 101.0 (ветеран), 344thx Активность: 1.15↘0 Статус: Участник
|
Создано: 08 ноября 2010 02:01 · Личное сообщение · #5
Isaev пишет: не понял твой код вообще Мой код? У меня нет кода. Я написал, что если d = 9, то программа выдаст 2 (я показал последовательные изменения переменных по ходу выполнения кода). Вот подобие решения:
Сложение легко сделать через логику. Если надо покажу весь код.
| Сообщение посчитали полезным: |
Ранг: 441.3 (мудрец), 297thx Активность: 0.41↘0.04 Статус: Участник
|
Создано: 08 ноября 2010 04:19 · Поправил: tihiy_grom · Личное сообщение · #6
intа ты не ошибся с b << 2?
так вроде правильнее
| Сообщение посчитали полезным: |
Ранг: 756.3 (! !), 113thx Активность: 0.61↘0.05 Статус: Участник Student
|
Создано: 08 ноября 2010 04:29 · Поправил: Isaev · Личное сообщение · #7
tihiy_grom пишет: а ты не ошибся с b << 2? ну это опечатка видимо... ты же тоже ошибся с a>b вас если объединить, вообще правильно будет
спасибо... решение вроде простое, что-то тупанул, даже стыдно )
----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh | Сообщение посчитали полезным: |
Ранг: 441.3 (мудрец), 297thx Активность: 0.41↘0.04 Статус: Участник
|
Создано: 08 ноября 2010 04:33 · Поправил: tihiy_grom · Личное сообщение · #8
Isaev пишет: ты же тоже ошибся с a>b да, есть такое но я бы всё равно хотел взглянуть на сложение чисел через логические операции
| Сообщение посчитали полезным: |
Ранг: 756.3 (! !), 113thx Активность: 0.61↘0.05 Статус: Участник Student
|
Создано: 08 ноября 2010 04:38 · Личное сообщение · #9
tihiy_grom пишет: но я бы всё равно хотел взглянуть на сложение чисел через логические операции где-то валялось ещё со времён спектрума... надо покопать архивы int если у тебя под руками, то я тоже за
----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh | Сообщение посчитали полезным: |
Ранг: 310.8 (мудрец), 29thx Активность: 0.43↘0 Статус: Участник
|
Создано: 08 ноября 2010 10:40 · Личное сообщение · #10
Немного подскажу как делать сложение : делаем побитовый XOR , а биты переноса - это побитовый AND. Цикл пока перенос не будет равен нулю. Давно не программил, поэтому код не привожу.
| Сообщение посчитали полезным: |
Ранг: 488.1 (мудрец), 272thx Активность: 0.35↘0 Статус: Участник
|
Создано: 08 ноября 2010 11:24 · Поправил: Модератор · Личное сообщение · #11
Isaev пишет: B:=B Shl 3+B Shl 1; а если асм.. lea eax, [eax*4+eax] //умножение на 5 От модератора: исправил mov на leashl eax,1 //умножение на 2
----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... | Сообщение посчитали полезным: |
Ранг: 56.1 (постоянный), 9thx Активность: 0.04↘0 Статус: Участник
|
Создано: 08 ноября 2010 23:27 · Личное сообщение · #12
у меня что-то такое записано для сложения через логику: a+b=c: c_i := a_i xor b_i xor z_{i-1} q_i := a_i & b_i p_i := a_i | b_i z_i := q_i | (p_i & z_{i-1}) вроде похоже на правду
| Сообщение посчитали полезным: |
Ранг: 756.3 (! !), 113thx Активность: 0.61↘0.05 Статус: Участник Student
|
Создано: 08 ноября 2010 23:51 · Поправил: Isaev · Личное сообщение · #13
vptrlx x_i - байтовые, а z_{i-1} перенос от предыдущей байтовой операции?
----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh | Сообщение посчитали полезным: |
Ранг: 488.1 (мудрец), 272thx Активность: 0.35↘0 Статус: Участник
|
Создано: 09 ноября 2010 10:34 · Личное сообщение · #14
VodoleY пишет: ea eax, [eax*4+eax] //умножение на 5 От модератора: исправил mov на lea Упс. сори ну конечно... спс модератору. (то я не проснулся еще )
----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... | Сообщение посчитали полезным: |
Ранг: 56.1 (постоянный), 9thx Активность: 0.04↘0 Статус: Участник
|
Создано: 09 ноября 2010 22:04 · Личное сообщение · #15
Isaev битовые, конечно же. а есть ещё хитрая штуковина, которая позволяет сложение делать параллельно (то, что я написал, из-за пересчёта переносов не параллелится) -- там вводилась какая-то забавная операция над парами чисел, говорилось, что вот она ассоциативна, а сложение уже из неё как-то получалось
| Сообщение посчитали полезным: |