Zdravím,
právě se učím jazyk C z knihy "Programovací jazyk C" od K&R (B. W. Kernihgan & D. M. Ritchie) vydáno Computer Press 2013.
V druhé kapitole, která pojednává mimo jiné o bitových operátorech jsou tato cvičení:
Cvičení 2.6: Napište funkci nastavbity(x,p,n,y) , která vrátí X s N bity začínajícími na pozici P nastavenými podle N nejpravějších bitů v Y a ostatní ponechá beze změny.
Cvičení 2.7: Napište funkci invertuj(x,p,n) , která vrátí X s N invertovanými bity (to znamená s 1 změněnými na 0 a naopak) začínajícími na pozici P a ostatní ponechá beze změny.
Pozn.: Předpokládá se, že bitová pozice začíná číslem 0 a je na pravé straně. Použil jsem kapitálky proměnných (X,P,N,Y) pro odlišení od ostatního textu. Jinak jsou proměnné samozřejmě psány malými písmeny. Předpokládá se že proměnné mají smysluplné hodnoty.
Ve cvičeních je překladatelská chyba, protože v knize jsou uvedeny funkce:
nastavbity(x,p,n) a invertuj(x,p,n,y)
jsou tedy prohozeny parametry mezi oběma cvičeními. Ve výše zmíněných Cvičeních jsem chybu opravil.
Trochu jsem se s tím potrápil, ale nakonec jsem vše vyřešil takto:
Cvičení 2.6:
#include <stdio.h>
int nastavbity(unsigned x, unsigned p, unsigned n, unsigned y);
int main()
{
unsigned x = 150, p = 5, n = 3, y = 11;
unsigned vysledek = nastavbity(x,p,n,y);
printf("%d\n", vysledek);
}
int nastavbity(unsigned x, unsigned p, unsigned n, unsigned y)
{
return x | (y & ~(~0 << (p+1-n))) << (p+1-n);
}
a Cvičení 2.7:
#include <stdio.h>
int invertuj(unsigned x, unsigned p, unsigned n);
int main()
{
unsigned x = 173, p = 5, n = 4;
unsigned vysledek = invertuj(x,p,n);
printf("%d\n", vysledek);
}
int invertuj(unsigned x, unsigned p, unsigned n)
{
unsigned mask; /* maska pro vypocet */
mask = ~(~0 << n) << (p+1-n);
return (x | mask) & ~(x & mask);
}
Chtěl bych se zeptat, jestli máte někdo jiné a lepší řešení. Případně, jestli někdo máte řešení zmíněných cvičení z výše jmenované knihy ke stažení (protože to nikde nemohu najít).
novomente