Решил сделать чтобы можно узнать какой порядок если значение наследует.
Которые все знают про 2/4/8/16/32 и так далее.
Которые все знают про 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
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 ну суть понял?
чтобы не было целиком порядок и вычеслять количество байтов
переделал
забыл вот так стоял
если 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
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
забыл вот так стоял
если 32 бит то цикл 31 раз прибавляет ему то есть не актуально
чтобы быстрый поиск по значение и получить порядок
чтобы быстрый поиск по значение и получить порядок
например если у меня 3 бит значит будет выполнять порядок с 2 очереди до 0, или если 2 бит то очередь 2 до 0 ну суть понял?
чтобы не было целиком порядок и вычеслять количество байтов
переделал