Avatar billede thomas_nj Nybegynder
15. maj 2005 - 21:34 Der er 10 kommentarer og
1 løsning

Forståelsesproblemer med en bit operator

Hej eksperter

  Jeg har lidt problemer med at forstå << operatoren. I thinking C++ har jeg fået følgende eksempel:

#include <iostream>
#include <cstdlib>

using namespace std;

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

int main()
{
    printBin('A');
    system("pause");           
    return 0;
}

  Meningen er så at programmet skal udskrive det givne tegn binært. Det virker også ganske fint A=65=01000001

  Mit problem ligger i at jeg ikke forstår if(val & (1 << i)).
  Jeg ved at & retunerer 1 hvis der står 1 på begge sider af den. Men så er jeg også stået af.

  Er der en, der har en hurtig forklaring?
Avatar billede arne_v Ekspert
15. maj 2005 - 21:38 #1
1 << i

sætter den i'te bit

1 << 0 = 0001
1 << 1 = 0010
1 << 2 = 0100
1 << 3 = 1000

val & (1 << i)

giver 0 (false) hvis den i'te bit ikke er sat i val o og !=0 (true) hvis den i'te bit er sat i val
Avatar billede arne_v Ekspert
15. maj 2005 - 21:38 #2
Avatar billede thomas_nj Nybegynder
15. maj 2005 - 22:00 #3
Havde ikke lige læst artiklen, den hjalp på hvad << gør men har lige en sidste ting.
(1 << i) vil så producere:
00000001
00000010
00000100
etc.
Det vil så blive "sammenlignet" med val som er 01000001
ved 01000001 & 00000001 står der 1 på begge sider altså retunerer den 1
ved 01000001 & 00000010 står der 0 og 1 altså retunerer den 0

  Vil det så sige at & retunerer 1 bare det med 1'tallerne passe et sted i byten?
Avatar billede arne_v Ekspert
15. maj 2005 - 22:03 #4
nej kun hvis samme plads

men det er godt nok

01000001 & 00000001 = 00000001 = true
01000001 & 00000010 = 00000000 = false
...
01000001 & 01000000 = 01000000 = true
01000001 & 10000000 = 00000000 = false
Avatar billede thomas_nj Nybegynder
15. maj 2005 - 22:04 #5
Kom til at glemme at i tæller nedad. Mente
10000000
01000000
00100000
etc.
Det vil så blive "sammenlignet" med val som er 01000001
ved 01000001 & 01000000 står der 1 på begge sider altså retunerer den 1
ved 01000001 & 00100000 står der 0 og 1 altså retunerer den 0
Avatar billede thomas_nj Nybegynder
15. maj 2005 - 22:05 #6
Ja altså hvis der står 1 på nr n plads i 2 bytes og jeg bruger & vil den retunere 1?
Avatar billede arne_v Ekspert
15. maj 2005 - 22:05 #7
den tæller nedad fordi udskrivningen skal udskrive første tal først
Avatar billede arne_v Ekspert
15. maj 2005 - 22:06 #8
i 2 bits - ja
Avatar billede thomas_nj Nybegynder
15. maj 2005 - 22:11 #9
Skal lige være 100% sikker på at jeg forstår det.
010000000 er 1 byte.  Hvert tal i den byte er en bit.

00100000 & 00101111 Giver true fordi at der på plads nr. 3 fra venstre står 1 i begge bytes. Forstår jeg det rigtigt? (hvis ja gider du så ikke svare?)
Avatar billede arne_v Ekspert
15. maj 2005 - 22:15 #10
01000000 binært er 8 bits = 1 byte med værdien decimal 64

00100000 & 00101111 binært giver 00100000 fordi den tredie højeste bit er sat i begge
og alt som er forskelligt fra 0 er true
Avatar billede thomas_nj Nybegynder
15. maj 2005 - 22:18 #11
ok, mente også at der var 8 bit i en byte men kan se jeg ramte 0 lige lovlig mange gange. Men nu forstår jeg det endelig, mange tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester