» »

Program v C - nujno

Program v C - nujno

borut2121 ::

Zdravo,

na faksu smo dobili cikel domačih nalog, zataknilo pa se mi je pri naslednji nalogi:
Zapiši program v programskem jeziku C, ki preverja stanje tretjega najmanj obteženega bita v spremenljivki A. Če je bit postavljen, postavi četrti najmanj obtežen bit v spremenljivki B na 1, sicer pa na 0. Spremenjeno spremenljivko B izpiši v šestnajstiški obliki.

Spremenljivki A in B sta tipa unsigned int! Vrednost spremenljivke B je na začetku 0.


Bi bil kdo tako prijazen in mi jo pomagal rešit?

Najlepša hvala že vnaprej!

Lep pozdrav,
Borut

BlueRunner ::

A & 4
B | 8
B & ~(unsigned int)8
printf("%x", ...)

WarpedGone ::

100% programersk odgovor. 100% praviln a za reveža 100% neuporabn. baraba :P
Zbogom in hvala za vse ribe

BlueRunner ::

Na faksu na koncu semestra ne pozna bitnih operacij?

Morda sem res baraba, ampak v pravo smer sem mu pa le pokazal kam naj gleda. Sedaj pa naj dokaže, da si zasluži študirati na državne stroške.

Tutankhamun ::

nč lahk se zbriše moj nikakršn prispevk sm se zaj...
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

borut2121 ::

Mogoče pa ne hodim na računalniški faks in še ne znam tako dobro programirat? Bitne operacije sicer poznam, ampak to še zdaleč ni dovolj.

BlueRunner ::

na faksu smo dobili cikel domačih nalog
Torej se gre za takšen ali drugačen tehničen faks. Drugje se ne učijo programiranja v C-ju.

Mogoče pa ne hodim na računalniški faks in še ne znam tako dobro programirat
Kot začetnik je razumljivo, da ne znaš programirati. Zelo težko pa verjamem, da je nekdo kar tako dal domače naloge, pa tri mesece nič povedal o temi.


Lahko gremo pa od začetka, kakor bi šel z asistentom. Ne zaradi zafrkancije, ampak zato, da se boš česa naučil.


Prvo vprašanje: ali znaš napisati, prevesti in zagnati program, ki izpiše "Hello World!"?
Drugo vprašanje: ali poznaš sintakso pogojnih stavkov v C-ju?

borut2121 ::

Odgovor na prvo vprašanje: da
Odgovor na drugo vprašanje: da

BlueRunner ::

OK.

Ali poznaš pojem obteženosti bitov?
Ali znaš (na papirju, s kalkulatorjem) pretvarjati med dvojiškim, desetiškim in šestnajstiškim številskim sistemom?

Ali veš kaj naredi stavek
if (A & 4) { ... }

Ktj ::

Da nebom nove teme odpiru: Bi mi lahko kdo dau link v zvezi s temelmi bitnimi opratorji, namreč najdem jih že sam kaj mi pomaga kaj pomeni ko pa ni primera\razloženo kako dela. Dejansko bi pa rabu da bi v char spremenljiviki lahko spreminjal bit za bitom.

Tutankhamun ::

učbenik digitalni sistemi mogoče kej tazga pa če začneš tm 20 stran boolova algebra.

Drgač pa tko na hit:
operator &: lahko za preverjanje kateri bit je postavljen
operator |: postavljanje bitov na 1
operator ^: spreminjanje vrednosti bitov (toggle)
operator ~: spremeni vse bite v kontra vrednost, negacija

primer za &:
int A = 0x35; // 00110101
int MASKA = 0x04; // 00000100 postavitev tretjega bita
if (A & MASKA) // Preverjanje ali je tretji bit postavljen
{
// TODO: tretji bit je postavljen
}

primer za |:
int A = 0x35; // 00110001
int MASKA = 0x44; // 01000100 Postavitev sedmega in tretjega bita če še ni
A |= MASKA; // A ima sedaj vrednost 01110101

primer za ^:
int A = 0x35; // 00110101
int MASKA = 0xf4; // 11110100 Povsod kjer so enice v MASKi bodo biti v Aju spremenili vrednost
A ^= MASKA; // A ima sedaj vrednost 11000001

primer za ~:
int A = 0x35; // 00110101
A = ~A; // A ima sedaj vrednost 11001010

Pa še predpostavli da je int dolžine samo 1 BAJT, da se nau kdo obešu na to, al pa si int zamisl kot da je char.

Zdej pa probi s to malo teorijo prevert kako si je BlueRunner zamislu rešt primer v 2. postu.
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

Ktj ::

Se pravi:

if(A & 0x04)
{
B |=0x08;
}
else
{
B ~|=0x08;
}
.
.
.


Tko sm jest nekako zastopu teorijo.

ampak blueruner je napisu:

B & ~(unsigned int)8//sam kokr kej prov zastom to bi ceu int spremenil v 1111 razn na enem mestu bi bla 0?

Drgač pa hvala za link pa za post, thnx alot :)

P.S.
Pa še "mal" uprašanj :P

je A & 0x04 == A & 8 //mislm da je 0x04=8(upam da mam še tok logike)

Recmo da tist gor drži, kako bi potlej izvedu neko for zano da bi a skoz za eno vrednost veču(številsko ne bit za bitom):

char A;
for( _int8 i = 0; i < 256; i++)
{

A |=256;
A =~A;
A |=i;
}
Bi tale for zanka šla skoz vse bitne možnosti za char?

edit: da nedelam double post kthnx

Zgodovina sprememb…

  • spremenil: Ktj ()

borut2121 ::

Program mi je že uspelo napisati. BlueRunner, še enkrat hvala za pomoč!

BlueRunner ::

Se pravi:

if(A & 0x04)
{
    B |=0x08;
}
else
{
    B ~|=0x08;
}

"B ~|=0x08;" to ni pravilen konstrukt v C/ju. ~=, |=, += so skrajšani izrazi za prirejanje vrednosti binarne operacije nazaj isti spremenljivki.

Pa pravilno bi bilo "B &= ~8;" kar razširjeno pomeni isto kot "B = B & (~8)"

B & ~(unsigned int)8//sam kokr kej prov zastom to bi ceu int spremenil v 1111 razn na
enem mestu bi bla 0?

Pravilno si razumel.

je A & 0x04 == A & 8 //mislm da je 0x04=8(upam da mam še tok logike)

Ne. 0x04 je 4 decimalno. 0x08 je 8 decimalno. 0x09 je 9 decimalno. 0x0a je 10 decimalno. Še enkrat poglej pretvorbo med številskimi sistemi. Svar sploh ni težka, ampak izgleda, da vas tega nihče več ne uči.

Recmo da tist gor drži, kako bi potlej izvedu neko for zano da bi a skoz za eno vrednost veču(številsko ne bit za bitom):

Zanka je čisto mimo, zato je ne bom niti ponavljal.
a) spremenljivke A nisi inicializiral. To pomeni, da v prvem ciklu ne bo imela znane vrednosti.
b) "A|=256" pomeni, da rečeš, da izvedeš binarni OR med A in binarno vrednostjo 100000000(2). Ta binarna vrednost presega 8 bitov, kolikor lahko zapišeš v byte. Kar pomeni, da si dejansko naredil "A |= 0". Z drugimi besedami: v tem stavku vrednosti nikoli ne spremeniš.
c) "A=~A" pomeni, da si vrenost negiral. Če bi bila začetna vrednost A = 0, potem bi sedaj imel v A-ju 0xff (oziroma 11111111 dvojiško).
d) "A|=i" je sedaj brez veze. Tisti trenutek, ko imaš vse bite postavljene na 1, lahko izvajaš operacijo OR do onemoglosti, pa to ne bo spremenilo rezultata.


Bi tale for zanka šla skoz vse bitne možnosti za char?

Daj mo ugotoviti kaj sploh potrebuješ. To kar si napisal, se sliši kot "for (int ii=0; ii
< 256; ii++);" Spremenljivka ii bo tukaj šla skozi vse veljavne vrednosti za char. Ne vem kaj bi potreboval gledati bit-ke.

Če pa želiš, da bi šla spremenljivka skozi vrednosti v smislu 00000001(2), 00000010(2), 00000100(2), 00001000(2), ... potem pa tega ne delaš z logičnimi operacijami, temveč z pomikanjem bitov v levo ali v desno (ekvivalent celoštevilskega množenja ali deljenja z 2).

Tutankhamun ::

Aja še neki, da te nebo begal preveč.
A |= MASKA; je enako kot če napišeš A = A | MASKA;
A &= MASKA; je enako A = A & MASKA;
...

Pa še neki bitnih operacij:
Pomikanje bitov v levo
int A = 0xC8; // 10101000
A <<= 2; // pomik v levo za dva bita, A bi imel sedaj vrednost 10100000

v desno je pa sam uporabiš operator >>. Pa pazi da uporabljaš unsigned tipe. Drgač se lahk nategneš če bo imeu MSb vrednost 1.
AMD Phenom QUAD 9950 Black Edition, 8GB

Ktj ::

Hvala za tele odgovore.Bom bol podrobno pogledu kt pridem dam. Je že kr neki časa od kar smo mel nazadne krkol v šoli v zvezi z boolovo logiko :P. Je pa tud res da mamo šele nasledn semester na faxu c. Atm mamo js kt mi pa smrdi.
LP

TEDY ::

Ktj ::

Bi tale for zanka šla skoz vse bitne možnosti za char?

Daj mo ugotoviti kaj sploh potrebuješ. To kar si napisal, se sliši kot "for (int ii=0; ii
< 256; ii++);" Spremenljivka ii bo tukaj šla skozi vse veljavne vrednosti za char.

Hehe dejansko...:P

Ne vem kaj bi potreboval gledati bit-ke.


Zato ker bi se rad malce poigrav z MD5(z nekakšnim bruteforce), ampak zato sem pa rabu za 100% da bom šu skoz vse možnosti za char.

Hvala za razumljivo razlago glede bitnih operacij.
LP


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C in funkcije ter #define

Oddelek: Programiranje
463768 (2129) misek
»

Logične operacije z biti (težka naloga)

Oddelek: Programiranje
111617 (955) marjan_h
»

iz binarne vrednosti v string

Oddelek: Programiranje
161773 (1408) Ktj
»

[C] bitni operator (strani: 1 2 3 )

Oddelek: Programiranje
1125240 (4073) Thomas
»

[java ali C] Datoteka v obliki 0 in 1

Oddelek: Programiranje
191765 (1485) Mmm'Aah

Več podobnih tem