ПредишенСледващото

Имаше нужда от "бързи" алгоритъм обхождане на всички възможни разположения K единици на N бита. Малко работа с Google, но не са намерили алгоритмите без вложени цикъла два пъти. Но вие искате да получите функцията да "произвеждат" на следната комбинация на базата на предишния. Да и съхраняват единици и нули, е желателно не в реда (един байт) и номера на цифри (малко по малко). В този случай, разбира се, възниква въпросът битови числа като ограничение на N. параметър След използва броя на битовете 64, 128, 256 бита и т.н. Например, можете да използвате big_int клас като част от библиотеките Boost. Нека да изчислите очни различни разположения изпълнения 3-DX блокове 5 и изхвърлянето на подреждане на тези опции:

Описание на алгоритъма

Общо 10 възможности (брой на пет комбинации от три). Визуално, алгоритъмът изглежда като минава през лявата. Опишете го официално използване на рекурсия:

1) Ако най-дясната характер "0", ние откриваме сред всички звена на Четвъртата картина и тя се премести към една позиция надясно.

2) Ако най-дясната характер "1", то пържоли на разстояние от дясната символ и изпращане на получената последователност (с дължина N-1 К-1 единици) в претенция 1 алгоритъм. Получената стойност е най-подходящия и да влезе по-рано нарязани единица веднага след това.

Създаване на необходимите операции на C ++ език

Когато се съхранява в мулти-битов комбинация от променливи, ние се нуждаем от следните операции:

а) определяне на стойността на операцията LSB

б) Експлоатация на смени дясната най-ниското, неприкосновеността на по-значими бита.

в) Единицата за работа добавяне на правото на младия.

Сега, на метода за генериране на първата комбинация. К единици са изместени надясно на (N-K) позиции.

Основният метод за изчисляване на играта инвентар описан алгоритъмът ни:

допълнение

1) Вместо на функциите (б) и (може да използвате макроси в).
(Бъдете внимателни с вложени макро повикване - но избяга)

2) внимателно константи вида:
(1 <<48) не равно (0x01000000000000)
(__int64 (1) <<48) равно (0x01000000000000)

Силно препоръчвам тази история: Малко да си играе с хакове

Подкрепете проекта - споделете линка, благодаря!