Решил сделать чтобы можно узнать какой порядок если значение наследует.
Которые все знают про 2/4/8/16/32 и так далее.
method getPower takes nothing returns integer
	local integer power = 0
 	local integer offset = 0
            
	if id == 0 then
		if count == 0 then
			set power = 1
		else
			set offset = ids[count - 1]
			set power = offset * 2
		endif
                
		set ids[count] = power
		set powers[power] = count
        
		// TODO: Тут оптимизировать
		loop
			exitwhen offset == 0
			set powers[power + 1] = count
			set offset = offset - 1
		endloop
	                
		set id = power
		set count = count + 1
	endif

	return id
endmethod
Как видите в коде где я пометил TODO. Надо изменить на оптимальный, а то если power 8 то 7 циклов делает, или 16 то 15 циклов по 1 единиц. Но как все это сократить???
Пример
array[1] = 0 / new
array[2] = 1 / new
array[3] = 1
array[4] = 2 / new
array[5] = 2
array[6] = 2
array[7] = 2
array[8] = 3 / new
array[9] = 3
array[10] = 3
array[11] = 3
array[12] = 3
array[13] = 3
array[14] = 3
array[15] = 3

Принятый ответ

set powers[power + offset] = count
забыл вот так стоял
если 32 бит то цикл 31 раз прибавляет ему то есть не актуально
чтобы быстрый поиск по значение и получить порядок
чтобы быстрый поиск по значение и получить порядок
например если у меня 3 бит значит будет выполнять порядок с 2 очереди до 0, или если 2 бит то очередь 2 до 0 ну суть понял?
чтобы не было целиком порядок и вычеслять количество байтов
переделал
внутри код
library xePower initializer Init
    globals
        /* --------------------------------------- */
        private integer       xe_count    = 1
        private integer       xe_powerMax = 0
        private integer array xe_powersOf2
        private integer array xe_helpers
        /* --------------------------------------- */
    endglobals
    
    function GetPower takes integer index returns integer
        local integer offset = 1
        
        if index < 0 then
            return 0
        endif
        
        if xe_powersOf2[index] == 0 then
            set xe_powersOf2[index] = xe_powersOf2[index - 1] * 2
            set xe_count = xe_count + 1
            
            loop
                exitwhen offset == xe_powersOf2[index]
                set xe_helpers[xe_powersOf2[index] + offset] = index
                set offset = offset + 1
            endloop
            
            set xe_powerMax = xe_powersOf2[index] + offset
        endif

        return xe_powersOf2[index] 
    endfunction
    
    function GetPowerHelper takes integer power returns integer
        if power <= 0 then
            return 0
        endif
        
        if power > xe_powerMax then
            set power = xe_powerMax
        endif
        
        return xe_helpers[power]
    endfunction
    
    private function Init takes nothing returns nothing
        set xe_powersOf2[0] = 1
        set xe_helpers[1] = 1
    endfunction
endlibrary
PS обновил
library xePower initializer Init
    globals
        /* --------------------------------------- */
        private integer       xe_powerMax = 0
        private integer array xe_powersOf2
        private integer array xe_helpers
        /* --------------------------------------- */
    endglobals
    
    function GetPower takes integer index returns integer
        local integer offset = 0
        
        if index <= 0 then
            return 0
        endif

        if xe_powersOf2[index] == 0 then
            set xe_powersOf2[index] = xe_powersOf2[index - 1] * 2

            loop
                exitwhen offset == xe_powersOf2[index]
                set xe_helpers[xe_powersOf2[index] + offset] = index
                set offset = offset + 1
            endloop
            
            set xe_powerMax = xe_powersOf2[index] + offset
        endif

        return xe_powersOf2[index] 
    endfunction
    
    function GetPowerHelper takes integer power returns integer
        if power <= 0 then
            return 0
        endif
        
        if power > xe_powerMax then
            set power = xe_powerMax
        endif
        
        return xe_helpers[power]
    endfunction
    
    private function Init takes nothing returns nothing
        set xe_powersOf2[1] = 1
        set xe_helpers[1] = 1
    endfunction
endlibrary
Терь можно делать подбор только важных а не целиком.
local integer index = GetPowerHelper(33)
            
            loop
                exitwhen IDs == 0 or index == 0
                if IDs >= GetPower(index) then
					// Выполняет правильно index (32,1) а раньше было (32,16,8 и так далее)
                    set IDs = IDs - GetPower(index)
                    set index = GetPowerHelper(IDs)
                else
                    set index = index - 1
                endif
            endloop
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
28
5 лет назад
0
		loop
			exitwhen offset == 0
			set powers[power + 1] = count
			set offset = offset - 1
		endloop
Но ведь тут ничего полезного не происходит, ты просто в powers[power + 1] offset раз присваиваешь одно и то же значение.
0
23
5 лет назад
0
set powers[power + offset] = count
забыл вот так стоял
если 32 бит то цикл 31 раз прибавляет ему то есть не актуально
чтобы быстрый поиск по значение и получить порядок
чтобы быстрый поиск по значение и получить порядок
например если у меня 3 бит значит будет выполнять порядок с 2 очереди до 0, или если 2 бит то очередь 2 до 0 ну суть понял?
чтобы не было целиком порядок и вычеслять количество байтов
переделал
внутри код
library xePower initializer Init
    globals
        /* --------------------------------------- */
        private integer       xe_count    = 1
        private integer       xe_powerMax = 0
        private integer array xe_powersOf2
        private integer array xe_helpers
        /* --------------------------------------- */
    endglobals
    
    function GetPower takes integer index returns integer
        local integer offset = 1
        
        if index < 0 then
            return 0
        endif
        
        if xe_powersOf2[index] == 0 then
            set xe_powersOf2[index] = xe_powersOf2[index - 1] * 2
            set xe_count = xe_count + 1
            
            loop
                exitwhen offset == xe_powersOf2[index]
                set xe_helpers[xe_powersOf2[index] + offset] = index
                set offset = offset + 1
            endloop
            
            set xe_powerMax = xe_powersOf2[index] + offset
        endif

        return xe_powersOf2[index] 
    endfunction
    
    function GetPowerHelper takes integer power returns integer
        if power <= 0 then
            return 0
        endif
        
        if power > xe_powerMax then
            set power = xe_powerMax
        endif
        
        return xe_helpers[power]
    endfunction
    
    private function Init takes nothing returns nothing
        set xe_powersOf2[0] = 1
        set xe_helpers[1] = 1
    endfunction
endlibrary
PS обновил
library xePower initializer Init
    globals
        /* --------------------------------------- */
        private integer       xe_powerMax = 0
        private integer array xe_powersOf2
        private integer array xe_helpers
        /* --------------------------------------- */
    endglobals
    
    function GetPower takes integer index returns integer
        local integer offset = 0
        
        if index <= 0 then
            return 0
        endif

        if xe_powersOf2[index] == 0 then
            set xe_powersOf2[index] = xe_powersOf2[index - 1] * 2

            loop
                exitwhen offset == xe_powersOf2[index]
                set xe_helpers[xe_powersOf2[index] + offset] = index
                set offset = offset + 1
            endloop
            
            set xe_powerMax = xe_powersOf2[index] + offset
        endif

        return xe_powersOf2[index] 
    endfunction
    
    function GetPowerHelper takes integer power returns integer
        if power <= 0 then
            return 0
        endif
        
        if power > xe_powerMax then
            set power = xe_powerMax
        endif
        
        return xe_helpers[power]
    endfunction
    
    private function Init takes nothing returns nothing
        set xe_powersOf2[1] = 1
        set xe_helpers[1] = 1
    endfunction
endlibrary
Терь можно делать подбор только важных а не целиком.
local integer index = GetPowerHelper(33)
            
            loop
                exitwhen IDs == 0 or index == 0
                if IDs >= GetPower(index) then
					// Выполняет правильно index (32,1) а раньше было (32,16,8 и так далее)
                    set IDs = IDs - GetPower(index)
                    set index = GetPowerHelper(IDs)
                else
                    set index = index - 1
                endif
            endloop
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.