strlen(decimal)

Тема в разделе "WASM.BEGINNERS", создана пользователем JCronuz, 24 дек 2010.

  1. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Привет всем!

    Есть удвоенное слово (DWORD) по началу его размер 1 байт

    Код (Text):
    1. DWORD d1 = 0;
    2.  
    3. 00000000
    Последующими действиями дворд можен заполнится до 8 позиций т.е.

    Код (Text):
    1. 11111111
    Как можно посчитать его длину, есть способ проще чем переводить целое число в строку через wsprintf и подсчет длины, может быть можно бы было побитно определить?


    PS: Плохо объяснил, как подсчитать сколько цифр в дворде?
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Бред... DWORD = double word. Word = double byte. Следовательно что?. DWORD равен 4 байтам. Считайте это аксиомой.
    Вы хотите узнать сколько в дворде занято разрядов, а сколько свободно?
     
  3. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Ну да торопился, появилась минута быстро настрочил, каюсь :)


    я хочу без перевода в строку целого числа узнать сколько у него циферок, т.е. в начале он байт потом два байта потом 4 байта

    DWORD d = 1;

    потом дофига операций выполнялось стало допустим

    d = 0005FAF0;

    как узнать длину без перевода в строку, нули те что слева естественно не считаются :)
     
  4. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Выполнить сравнения с 10, 100 1000 и т.д., всего 9 штук. В каком порядке - зависит от исходных данных.
     
  5. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Это сложно :)

    Казалось что можно выполнить в пару инструкций
     
  6. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Может так?
    Код (Text):
    1. 1111 1111[16]=1111 1111 1111 1111 1111 1111 1111 1111[2]
    2.  
    3.  
    4. count=0
    5.  
    6. 1111 1111 1111 1111 1111 1111 1111 1111
    7. and
    8. 0000 0000 0000 0000 0000 0000 0000 0001
    9. ---------------------------------------
    10. 0000 0000 0000 0000 0000 0000 0000 0001 >0 count++
    11.  
    12.  
    13.  
    14. 1111 1111 1111 1111 1111 1111 1111 1111
    15. and
    16. 0000 0000 0000 0000 0000 0000 0000 0010
    17. ---------------------------------------
    18. 0000 0000 0000 0000 0000 0000 0000 0010 >0 count++
    19.  
    20.  
    21.  
    22. 1111 1111 1111 1111 1111 1111 1111 1111
    23. and
    24. 0000 0000 0000 0000 0000 0000 0000 0100
    25. ---------------------------------------
    26. 0000 0000 0000 0000 0000 0000 0000 0100 >0 count++
    27.  
    28. Если count ==32 то Гуд))
     
  7. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Или если длину то слева начать?
    Код (Text):
    1. count=0
    2.  
    3. 1111 1111 1111 1111 1111 1111 1111 1111
    4. and
    5. 1000 0000 0000 0000 0000 0000 0000 0000
    6. ---------------------------------------
    7. 1000 0000 0000 0000 0000 0000 0000 0000 >0 count++
    8. .
    9. .
    10. .
    Тут действительно три инструкции:
    - сдвиг вправо
    - умножить
    - сравнить
     
  8. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    Уточни число в какой сис-ме счистения?
    если просто сколько байтов занято то лучше сдвигом
    m1:
    shl eax, 1
    inc cont
    jnc m1
     
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Человек хочет это:

    Код (Text):
    1. DWORD dwValue = 1234567;
    2. wsprintf(szValue, "%d", dwValue);
    3. DWORD dwResult = strlen(szValue); // dwResult = 7
    как вычислить dwResult из dwValue, не переводя число в строку? Система счисления тут не важна.
    Вроде, у свина в доках был такой алгоритм...
     
  10. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    4294967295 в десятичной длина 10 символов
    FFFFFFFF в шестнадцатиричной длина 8 символов
     
  11. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Вот функция:

    dwResult = ceil(log(dwValue))

    какая система счисления, по такому основанию берется логарифм

    // edit, +1 не надо
     
  12. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Код (Text):
    1. format pe gui 4.0
    2. include 'win32ax.inc'
    3.  
    4.  
    5.  
    6. section '' code executable import readable writable
    7.   library kernel32,'kernel32.dll',\
    8.           user32,'user32.dll'
    9.  
    10.   include 'api\kernel32.inc'
    11.   include 'api\user32.inc'
    12.  
    13.  
    14.   entry $
    15.  
    16. ; fldlg2     = 0.3010299956639811952
    17. ;            = 3FFD 9A209A84 FBCFF799
    18. ; экспонента = $3ffd-$3fff=-2
    19. ;
    20. ; посмотрим на fpu-число:
    21. ;   какие-то значения: 1.хх...
    22. ;   (отриц.) разряды : 0 12...
    23. ;
    24. ; сдвинув, как говорит fpu - на две позиции вправо, в самом старшем БИТЕ будет часть целого
    25. ; но сдвинув обратно на 1 позицию влево - дробь, что нам и нужно
    26.  
    27. число   = -1
    28. mov     eax,число
    29.  
    30. bsr     eax,eax
    31. inc     eax                                ;мы не fpu и логарифмы наши не всегда точны :)
    32. mov     edx,$9a20'9a84 shr ($3fff-$3ffd-1)
    33. mul     edx                                ;edx:eax = целое.дробь
    34.  
    35. ;это как 0.25 копеек пару раз, подбирая только целое(гривны или рубли)
    36.  
    37.  
    38.         invoke  ExitProcess,0
     
  13. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    в цикле делить на основание системы счисления до получения нулевых остатка и частного - алгоритм евклида что-ли
     
  14. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Всем огромное спасибо. Направили в нужном направлении :)
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Для чего тут фпу и логарифмы, если (как я понял) нужно кол-во не десятичных, а HEX-цифр "d = 0005FAF0" ?
    Код (Text):
    1. bsr eax,eax
    2. jz @F
    3. shr eax,2
    4. inc eax
    5. @@:
    PS: Если нужно число десятичных знаков, то edemko прав, но только способ определения множителя притянул из своего любимого места под названием fpu ;) Проще по "домохозяйски" на виндовом калькуляторе взять log(2), умножить на 2^32 и взять целую часть