Сейчас на форуме: laslo, UniSoft, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Логика
Посл.ответ Сообщение


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 08 ноября 2010 00:31
· Личное сообщение · #1

Как вычислить сколько знаков в десятичном целом числе, используя только сдвиги и логические операции?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 29.9 (посетитель), 9thx
Активность: 0.020.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.150
Статус: Участник

Создано: 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.610.05
Статус: Участник
Student

Создано: 08 ноября 2010 01:56 · Поправил: Isaev
· Личное сообщение · #4

[X-Ray] Сдвигать триадами?
Я бы поверил, что это работает, если бы речь шла о восьмеричной СС
но я попробую завтра...

int не понял твой код вообще

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 08 ноября 2010 02:01
· Личное сообщение · #5

Isaev пишет:
не понял твой код вообще

Мой код? У меня нет кода. Я написал, что если d = 9, то программа выдаст 2 (я показал последовательные изменения переменных по ходу выполнения кода).

Вот подобие решения:
Code:
  1. BigInt a; // your number
  2. BigInt b(1); // 1-ца
  3. int i = 0;
  4.  
  5. while (>= b)
  6. {
  7.   b = b << 3 + b << 2; // домножаем на 10
  8.   i++;
  9. }

Сложение легко сделать через логику. Если надо покажу весь код.



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 08 ноября 2010 04:19 · Поправил: tihiy_grom
· Личное сообщение · #6

int
а ты не ошибся с b << 2?

Code:
  1. while a>b do begin
  2.   b:= (shl 3) + (shl 1);
  3.   inc(i);
  4.  end;

так вроде правильнее




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 08 ноября 2010 04:29 · Поправил: Isaev
· Личное сообщение · #7

tihiy_grom пишет:
а ты не ошибся с b << 2?

ну это опечатка видимо...
ты же тоже ошибся с a>b

вас если объединить, вообще правильно будет
Code:
  1. While A>=B Do
  2.   Begin
  3.     B:=Shl 3+Shl 1;
  4.     Inc(I);
  5.   End;

спасибо... решение вроде простое, что-то тупанул, даже стыдно )

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 08 ноября 2010 04:33 · Поправил: tihiy_grom
· Личное сообщение · #8

Isaev пишет:
ты же тоже ошибся с a>b

да, есть такое

но я бы всё равно хотел взглянуть на сложение чисел через логические операции




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 08 ноября 2010 04:38
· Личное сообщение · #9

tihiy_grom пишет:
но я бы всё равно хотел взглянуть на сложение чисел через логические операции

где-то валялось ещё со времён спектрума...
надо покопать архивы
int если у тебя под руками, то я тоже за

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 08 ноября 2010 10:40
· Личное сообщение · #10

Немного подскажу как делать сложение : делаем побитовый XOR , а биты переноса - это побитовый AND.
Цикл пока перенос не будет равен нулю. Давно не программил, поэтому код не привожу.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 08 ноября 2010 11:24 · Поправил: Модератор
· Личное сообщение · #11

Isaev пишет:
B:=B Shl 3+B Shl 1;


а если асм..

lea eax, [eax*4+eax] //умножение на 5
От модератора: исправил mov на lea
shl eax,1 //умножение на 2

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 56.1 (постоянный), 9thx
Активность: 0.040
Статус: Участник

Создано: 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.610.05
Статус: Участник
Student

Создано: 08 ноября 2010 23:51 · Поправил: Isaev
· Личное сообщение · #13

vptrlx x_i - байтовые, а z_{i-1} перенос от предыдущей байтовой операции?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 09 ноября 2010 10:34
· Личное сообщение · #14

VodoleY пишет:
ea eax, [eax*4+eax] //умножение на 5
От модератора: исправил mov на lea


Упс. сори ну конечно... спс модератору. (то я не проснулся еще )

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 56.1 (постоянный), 9thx
Активность: 0.040
Статус: Участник

Создано: 09 ноября 2010 22:04
· Личное сообщение · #15

Isaev битовые, конечно же.
а есть ещё хитрая штуковина, которая позволяет сложение делать параллельно (то, что я написал, из-за пересчёта переносов не параллелится) -- там вводилась какая-то забавная операция над парами чисел, говорилось, что вот она ассоциативна, а сложение уже из неё как-то получалось


 eXeL@B —› Программирование —› Логика
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати