pomognete

5 отговора 396 прегледа
#1

pomognete

Niakoi moze li da mi obiasni kak raboti tazi funkcia


int FindFirstSet(unsigned BitMap,unsigned start)
{
unsigned Msk = (1<<start);
while(Msk)
{
if(BitMap & Msk)return start;
start ++:
Msk <<=1;
}
return -1;
}

i po konkretno kakvo se slucva tuk: (1<<start); i tuk: Msk <<=1;

Отговор
в отговор на unknown #2

Re: pomognete

1<<start означава 2^start (2 на степен start), защото изместването на битове на едно число веднъж наляво е равносилно на умножение по 2. Тук местиш start пъти.
Msk <<=1 е съкратен запис за Msk = Msk << 1; което си е умножение по 2. Би могло да се запише и така:
Msk *= 2; или Msk += Msk;, но не би било коректно , защо в случая наистина имаш работа с маска, а не с число. Та значи това придвижва един бит към старшата част на числото, докато не намери някой бит на съответната позиция.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #3

Re: pomognete

Msk <<=1 е съкратен запис за Msk = Msk << 1; което си е умножение по 2. Би могло да се запише и така:
Msk *= 2; или Msk += Msk;, но не би било коректно ...


Освен това би било и по-бавно, побитовото изместване/ротация се изпълняват по-бързо от умножението/деленето. Обикновено компилаторът бездруго инструкциите

brum *=2^stepen
brum /=2^stepen

ги замества с

brum <<= stepen
brum >>= stepen

но не винаги.

Заради еквивалентността на инстукциите едно време за режим 320х200 изчислението

Offset = 320*Y + X

се заменяше с

Offset = (Y << 2^8) + (Y << 2^6) + X

Eх, ама хубави времена бяха

Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Отговор
в отговор на Duncan Griffin #4

Aйде сега пък и ти!

Не ме разпалвай, че от август пиша на Жаба и псувам....какви времена бяха... Аз лично винаги съм проповядвал ( в тоя форум и по принцип ), че най-важното е да пишеш според логиката на програмата а да оставиш хватките на компилатора. Мога да се хвана на бас, че не е по ако напишеш умножение с константа степен на двойката от това да пишеш <<. От гледна точка на езика C++ си е едно и също. Разлика има само ако пишеш на асемблер.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #5

mersi

blagodaria, vaprosa bese dosta tap, no ciala sutrin se cesa po glavata kakvo pravi tova, a to prosto namiralo parvia srestnat vdignat bit, az vaobste biah zabravil tezi pobitovi operatori i posle otvorih i procetoh....nadiavam se pak da pomagate, zastoto sam se hvanal i uca assembler..........mezdu drugoto softIce za xp????????i ako ima, moga li s nego da debugna edno exe i da vidia na koi adress mi pokazva edno saobstenie (ce ne sam imal pravo na povece startirania, zastoto az ne mislia taka:))), vaobste s kakvo moga da startiram postapkovo programa, ciito sors niamam, i da vizdam na vsiaka stapka saotvetnata instrukcia na assembler

Отговор
в отговор на unknown #6

Re: mersi

ima edin laf - ot varatata za krakata... q po-dobre potyrsi is neta krack za taq ti programka. a inache ideqta da se uchi asembler s debuger e dobra, ako prenebregnesh vremeto koeto shte ti otneme (mnogo se symnqvam da iztraesh, ma ima sekvi). ima i klub maj za takiva kato teb...

Отговор