pomognete
5 отговора
396 прегледа
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;
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;
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?_
Msk <<=1 е съкратен запис за Msk = Msk << 1; което си е умножение по 2. Би могло да се запише и така:
Msk *= 2; или Msk += Msk;, но не би било коректно , защо в случая наистина имаш работа с маска, а не с число. Та значи това придвижва един бит към старшата част на числото, докато не намери някой бит на съответната позиция.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
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х, ама хубави времена бяха
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
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х, ама хубави времена бяха
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Aйде сега пък и ти!
Не ме разпалвай, че от август пиша на Жаба и псувам....какви времена бяха... Аз лично винаги съм проповядвал ( в тоя форум и по принцип ), че най-важното е да пишеш според логиката на програмата а да оставиш хватките на компилатора. Мога да се хвана на бас, че не е по ако напишеш умножение с константа степен на двойката от това да пишеш <<. От гледна точка на езика C++ си е едно и също. Разлика има само ако пишеш на асемблер.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
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
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...