strlen(decimal)

Discussion in 'WASM.BEGINNERS' started by JCronuz, Dec 24, 2010.

  1. JCronuz

    JCronuz New Member

    Blog Posts:
    0
    Joined:
    Sep 26, 2007
    Messages:
    1,240
    Location:
    Russia
    Привет всем!

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

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

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


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

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    Бред... DWORD = double word. Word = double byte. Следовательно что?. DWORD равен 4 байтам. Считайте это аксиомой.
    Вы хотите узнать сколько в дворде занято разрядов, а сколько свободно?
     
  3. JCronuz

    JCronuz New Member

    Blog Posts:
    0
    Joined:
    Sep 26, 2007
    Messages:
    1,240
    Location:
    Russia
    Ну да торопился, появилась минута быстро настрочил, каюсь :)


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

    DWORD d = 1;

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

    d = 0005FAF0;

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

    CyberManiac New Member

    Blog Posts:
    0
    Joined:
    Sep 2, 2003
    Messages:
    2,473
    Location:
    Russia
    Выполнить сравнения с 10, 100 1000 и т.д., всего 9 штук. В каком порядке - зависит от исходных данных.
     
  5. JCronuz

    JCronuz New Member

    Blog Posts:
    0
    Joined:
    Sep 26, 2007
    Messages:
    1,240
    Location:
    Russia
    Это сложно :)

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

    _sheva740 New Member

    Blog Posts:
    0
    Joined:
    Aug 31, 2005
    Messages:
    1,539
    Location:
    Poland
    Может так?
    Code (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

    Blog Posts:
    0
    Joined:
    Aug 31, 2005
    Messages:
    1,539
    Location:
    Poland
    Или если длину то слева начать?
    Code (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

    Blog Posts:
    0
    Joined:
    Aug 17, 2005
    Messages:
    400
    Location:
    Russia
    Уточни число в какой сис-ме счистения?
    если просто сколько байтов занято то лучше сдвигом
    m1:
    shl eax, 1
    inc cont
    jnc m1
     
  9. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Joined:
    Nov 23, 2004
    Messages:
    2,347
    Человек хочет это:

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

    artkar New Member

    Blog Posts:
    0
    Joined:
    Aug 17, 2005
    Messages:
    400
    Location:
    Russia
    4294967295 в десятичной длина 10 символов
    FFFFFFFF в шестнадцатиричной длина 8 символов
     
  11. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Joined:
    Nov 23, 2004
    Messages:
    2,347
    Вот функция:

    dwResult = ceil(log(dwValue))

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

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

    edemko New Member

    Blog Posts:
    0
    Joined:
    Nov 25, 2009
    Messages:
    454
    Code (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

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    в цикле делить на основание системы счисления до получения нулевых остатка и частного - алгоритм евклида что-ли
     
  14. JCronuz

    JCronuz New Member

    Blog Posts:
    0
    Joined:
    Sep 26, 2007
    Messages:
    1,240
    Location:
    Russia
    Всем огромное спасибо. Направили в нужном направлении :)
     
  15. leo

    leo Active Member

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