Ustawianie bitu

0

Napisz program, który dla danej liczby n ustawi jej k-ty bit na 1. Bity numerowane są od najmniej znaczącego, od zera.

No i rozwiazanie wyglada tak:

#include <stdio.h>
int main ()
{
    int n,k,x,f;
    scanf ("%d\n%d",&n, &k);
    x=1<<k;
    f=n|x;
    printf ("%d\n",f);
    return 0;
}

Teraz czy moglby mi ktos wytlumaczyc, bo nie rozumiem. Jezeli wprowadzimy, powiedzmy, n=8 [1000] i k=2, to powinnismy otrzymac 10 [1010], bo drugi bit jest ustawiony na 1, tak? Ale dlaczego tak nie jest? Dlaczego program przesuwa wszystkie bity o 1 w lewo, a nastepnie bierze alternatywe...

Prosze o pomoc

0

Po pierwsze pierwszy bit ma indeks 0 (z taką konwencją się zwykle spotyka). Nie przesuwasz wszystkich bitów w lewo, tylko przesuwasz jedynkę (0001) w lewo o k miejsc.

0
#include <iostream>
using namespace std;

void printBinary(const unsigned char val)
{
    for(int i=7;i>=0;i--){
        if(val &(1<<i))
            std::cout<<"1";
        else
            std::cout<<"0";
    }
}

#define PR(STR,EXPR)\
    cout<<STR;printBinary(EXPR);cout<<"\n";
int main()
{
    unsigned int getval;
    unsigned char a,b;
    cout<<"wprowadz liczbe z zakresu 0-255(8bitow)\n:";
    cin>>getval;
    a = getval;
    PR("a w zapisie binarnym: ",a);
    cout<<"wprowadz liczbe z zakresu 0-255(8bitow)\n:";
    cin>>getval;
    b = getval;
    PR("a w zapisie binarnym: ",b);

    PR("a | b : ",a|b);
    PR("a & b : ",a&b);
    PR("a ^ b : ",a^b);
    PR("~a : ",~a);
    PR("~b : ",~b);

    unsigned char c = 0x5A;
    PR("c w zapisie binarnym : ",c);
    a |= c;
    PR("a|=c :",a);
    b&=c;
    PR("b&=c : ",b);
    b^=a;
    PR("b^a : ",b);

    return 0;
}

Prosty przykład z Thinking in C++. Zobacz sobie jak działają operatory bitowe..

0

Aha, chyba juz rozumiem na czym to polega. Tylko czemu np 2-gi bit (ustawiony na 1) to 0100, a nie 0010?

0

Ponieważ wygląda to tak:
-na początku masz 0001
-przesuwasz o 2 miejsca w lewo
-dostajesz 0100

Jakbyś przesunął o jedno miejsce to byś dostał 0010

0

"Bity numerowane są od najmniej znaczącego, od zera."
3 2 1 0
0 1 0 0

0

Rozumiem, dzieki :)
Mam jeszcze jedno pytanie, co gdyby k-ty bit mial byc ustawiony na 0? Czego musialbym uzyc zamiast alternatywy? Jedyne co mi przychodzi to w jakis sposob bitami odjac te liczby, ale nie moge znalezc nic na temat takiej operacji

0

Robisz tak samo jak przy alternatywie, ale zamiast alternatywy robisz XOR(alternatywa wykluczająca) - czyli zamiast f=n|x to f=n^x

0

Ale jezeli w liczbie n, k-ty bit bedzie juz rowny 0 i zastosujemy XOR to wtedy ustawi sie na 1, a chcemy zeby pozostal 0

0

Rzeczywiście, no to inaczej:

int a = 7; //111
int b = 1;
b = b << 1; //010

b = ~b //101 - negacja
a = a & b //111 & 101 = 101 - iloczyn

//można krócej
a &= ~b;
0

dzieki :)