![]() |
Ma.. :) To beše čisto razumevanja radi (pošto je Gruja već dao primer sa pomeranjem), a i moje znanje C je.. sećanje :)
|
Citat:
već sam odavno zaboravio na ove fensi "shift" izraze. |
haha... jbte, i mene ste zbunili...
Da ti ne pishem detaljno, evo link pa pogledaj: http://www.vipan.com/htdocs/bitwisehelp.html Tu je sve lepo objasnjeno... Poenta price je da ti koriscenjem bitwise operatora dobijash neku drugu vrednost u registru... Dakle treba da znash logicke operacije AND, NOT, OR i XOR. e sada recimo imash broj 64 to je osam keceva: 11111111 i imash masku koja je 63 to je sedam keceva i nula: 11111110 i ukoliko uradish XOR opet cesh da dobijesh 64 iliti 11111111 e sada ti rece da ti treba komplement... koji potpuni ili nepotpuni?!? nepotpuno komplementiranje je u stvari negacija dakle koristicesh ~ a za potpuni komplement samo cesh na to sve da dodash 1... |
Citat:
Kao drugo, 11111111 XOR 11111110 nije 11111111 Već 1. :) |
u jbte... da da da... hahaha... kakav sam kreten... sorry osam keceva je 255 haha... 1000000 je 64... zajebo sam se...
Sorry ponovo... |
al ste ga iskomplikovali.... :D
sve se svodi na ono sto je gruja vec napisao: ako neku vrednost A XOR-ujes sa nekom maskom (nizom bita), binarno gledano na pozicijama gde je u maski 1, u rezultatu ce ta pozicija da ima invertovanu vrednost iz A, a tamo gde je u maski 0 nista se nece promeniti... znaci tako mozes da togglujes vrednosti nekih bitova u flagovima, ako su upaljeni ugasis ih i obrnuto (odnosno invertujes im vrednost, matematicki gledano). Znaci XOR je za toggle, ako zelis da upalis neki bit pomocu maske onda koristis OR, ako zelis da ga ugasis onda koristis AND sa invertovanom maskom... i tako ti rade ti racunari, prosto :) btw, ako ti i dalje nije sasvi leglo kako ovo radi, otvori windows kalkulator, prebaci ga u scientific mod i igraj se malo sa binarnim brojevima... kroz praksu se najbolje kapira.. |
Off Topic: Ko nije radio sprajtove na Spekiju ili Atariju ST ne sme da pricha o bit-maskama, od sad pa nadalje ;) |
E sad mi je delimično jasno: Ja ne mogu samo nad onim delom maske koji je obeležen jedinicama da vršim operaciju već nad ulaznim podatkom i celom maskom, zato mora ^ a ne ~ ... tako? :)
E sad još pravljenje maski... ja sam razumeo da se uzmu sve nule, pa se doda n broj jedinica pa se sve to pomera za pomeraj p i kako se pomera tako se dodaju nule s desne strane, right? I to radi ovaj kod: maska = ~(~0 << n) << p; Šta npr. raditi kad između jedinica treba da imam x nula u maski? :P npr. 000110100 Kako to radi? :D Jel može neko ovu liniju gore (bold) da mi objasni do detalja (mi smo koristili ovaj oblik... tačnije, u jednom zadatku smo koristili y = x >> p-n+1; pa onda maska = ~(~0<<n); za neko poravnjanje s desne strane)? @LiquidBrain: Sad ću da pogledam taj link |
Prvo sto treba da uradis je da dobro skapiras sta je AND, OR, XOR, NOT...
AND: 1 i 1 = 1, sve ostalo daje 0 OR: 0 i 0 = 0, sve ostalo daje 1 ... Pa onda tako da odlucis koji ces operator da koristis. Pored toga treba da znas precedence, odnosno kojim redom se izvrasavaju operacije |
Dakle, ako sam lepo shvatio, da bi dobio recimo masku 000110100 treba da odradim:
~(~(~(~0 << 2) << 1) << 1) << 2) ...znači imali bismo: 000000000000 početna vrednost 111111111111 ~ izvršeno nad prethodnom maskom 111111111100 << 2 izvršeno nad prethodnom maskom 000000000011 ~ izvršeno nad prethodnom maskom 000000000110 << 1 izvršeno nad prethodnom maskom 111111111001 ~ izvršeno nad prethodnom maskom 111111110010 << 1 izvršeno nad prethodnom maskom 000000001101 ~ izvršeno nad prethodnom maskom 000000110100 << 2 izvršeno nad prethodnom maskom Tako? :D |
Vreme je GMT +2. Trenutno vreme je 05:34. |
Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.