Привет всем! Есть удвоенное слово (DWORD) по началу его размер 1 байт Code (Text): DWORD d1 = 0; 00000000 Последующими действиями дворд можен заполнится до 8 позиций т.е. Code (Text): 11111111 Как можно посчитать его длину, есть способ проще чем переводить целое число в строку через wsprintf и подсчет длины, может быть можно бы было побитно определить? PS: Плохо объяснил, как подсчитать сколько цифр в дворде?
Бред... DWORD = double word. Word = double byte. Следовательно что?. DWORD равен 4 байтам. Считайте это аксиомой. Вы хотите узнать сколько в дворде занято разрядов, а сколько свободно?
Ну да торопился, появилась минута быстро настрочил, каюсь я хочу без перевода в строку целого числа узнать сколько у него циферок, т.е. в начале он байт потом два байта потом 4 байта DWORD d = 1; потом дофига операций выполнялось стало допустим d = 0005FAF0; как узнать длину без перевода в строку, нули те что слева естественно не считаются
Выполнить сравнения с 10, 100 1000 и т.д., всего 9 штук. В каком порядке - зависит от исходных данных.
Может так? Code (Text): 1111 1111[16]=1111 1111 1111 1111 1111 1111 1111 1111[2] count=0 1111 1111 1111 1111 1111 1111 1111 1111 and 0000 0000 0000 0000 0000 0000 0000 0001 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 0001 >0 count++ 1111 1111 1111 1111 1111 1111 1111 1111 and 0000 0000 0000 0000 0000 0000 0000 0010 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 0010 >0 count++ 1111 1111 1111 1111 1111 1111 1111 1111 and 0000 0000 0000 0000 0000 0000 0000 0100 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 0100 >0 count++ Если count ==32 то Гуд))
Или если длину то слева начать? Code (Text): count=0 1111 1111 1111 1111 1111 1111 1111 1111 and 1000 0000 0000 0000 0000 0000 0000 0000 --------------------------------------- 1000 0000 0000 0000 0000 0000 0000 0000 >0 count++ . . . Тут действительно три инструкции: - сдвиг вправо - умножить - сравнить
Уточни число в какой сис-ме счистения? если просто сколько байтов занято то лучше сдвигом m1: shl eax, 1 inc cont jnc m1
Человек хочет это: Code (Text): DWORD dwValue = 1234567; wsprintf(szValue, "%d", dwValue); DWORD dwResult = strlen(szValue); // dwResult = 7 как вычислить dwResult из dwValue, не переводя число в строку? Система счисления тут не важна. Вроде, у свина в доках был такой алгоритм...
Вот функция: dwResult = ceil(log(dwValue)) какая система счисления, по такому основанию берется логарифм // edit, +1 не надо
Code (Text): format pe gui 4.0 include 'win32ax.inc' section '' code executable import readable writable library kernel32,'kernel32.dll',\ user32,'user32.dll' include 'api\kernel32.inc' include 'api\user32.inc' entry $ ; fldlg2 = 0.3010299956639811952 ; = 3FFD 9A209A84 FBCFF799 ; экспонента = $3ffd-$3fff=-2 ; ; посмотрим на fpu-число: ; какие-то значения: 1.хх... ; (отриц.) разряды : 0 12... ; ; сдвинув, как говорит fpu - на две позиции вправо, в самом старшем БИТЕ будет часть целого ; но сдвинув обратно на 1 позицию влево - дробь, что нам и нужно число = -1 mov eax,число bsr eax,eax inc eax ;мы не fpu и логарифмы наши не всегда точны :) mov edx,$9a20'9a84 shr ($3fff-$3ffd-1) mul edx ;edx:eax = целое.дробь ;это как 0.25 копеек пару раз, подбирая только целое(гривны или рубли) invoke ExitProcess,0
в цикле делить на основание системы счисления до получения нулевых остатка и частного - алгоритм евклида что-ли
Для чего тут фпу и логарифмы, если (как я понял) нужно кол-во не десятичных, а HEX-цифр "d = 0005FAF0" ? Code (Text): bsr eax,eax jz @F shr eax,2 inc eax @@: PS: Если нужно число десятичных знаков, то edemko прав, но только способ определения множителя притянул из своего любимого места под названием fpu Проще по "домохозяйски" на виндовом калькуляторе взять log(2), умножить на 2^32 и взять целую часть