Bitové operace ve vyšších jazycích

radekk

Bitové operace ve vyšších jazycích
« kdy: 05. 09. 2016, 23:58:04 »
Ahoj, jsem programátor a programuju ve vyšších jazycích (hlavně python). Byl jsem u pohovoru, kde jsem dostal na papíru vyřešit úkol, který vypadal zhruba takto:
Kód: [Vybrat]
(10<<3)|((42&2)<<2) No trhnul jsem si docela ostudu, vůbec jsem nevěděl, co s tím mám dělat. Jak se řeší tyto úlohy? Neříkejte mi, že je potřeba si to všechno přepsat do dvojkové soustavy a ručně provádět jednotlivé bitové operace. To bych dělal hodinu, přitom to byl úkol na pět minut. Není na to nějaký trik?
« Poslední změna: 06. 09. 2016, 10:54:54 od Petr Krčmář »


Kit

Re:bitové operace
« Odpověď #1 kdy: 06. 09. 2016, 00:17:41 »
Na něco se ten trik použít dá, např. n<<3 je totéž jako n*8, ale tohle bys měl spočítat z hlavy do půl minuty.

Jenda

Re:bitové operace
« Odpověď #2 kdy: 06. 09. 2016, 00:22:29 »
> Neříkejte mi, že je potřeba si to všechno přepsat do dvojkové soustavy

Obecně takovéto operace v desítkové neumím a myslím, že to snad nejde. Dá se to z hlavy v šestnáctkové (nebo obecně v nějaké kde je základ mocnina dvojky).

Tady se to dá obejít všimnutím si, že 10<<3 je 10*8 = 80 a 42&2 není potřeba převádět, stačí zjistit, že 42 má nastavený druhý bit a tedy je to 2. 2<<2 je pak 2*4=8 a 80|8 je 88 protože 80 má jedničky jenom strašně vlevo (je to 64+16).

Jano

Re:bitové operace
« Odpověď #3 kdy: 06. 09. 2016, 00:36:24 »
Prevod do dvojkovej sustavy je pre mna ako programatora podvedoma zalezitost a viacmenej to vidim ako to vyzera.

Na zjednodusenie zapisu je vyhodne pisat ale v setnastkovej, lebo tam sa s bitmi robi rovnako dobre akurat je to menej pisania.

V priklade su 3 bitove operacie: << - bitovy posun dolava, | bitovy OR (bitovy sucet), a & bitovy AND (bitovy sucin).

A teraz samotny priklad:

10 = 0xa = 1010b = 8 + 2
42 = 0x2a = 101010b = 32 + 10 = 32 + 8 + 2
2 = 0x2 = 10b

10 << 3 = 1010000b # posun znamena dopisat 000 sprava
42 & 2 = 10b # 1 su len tam kde su v oboch cislach, cize iba 2
(42 & 2) << 2 = 1000b # dvojka + 2x 0

(10 << 3) | (42 & 2) << 2 = 1010000  | 1000 = 1011000b = 0x58 = 88

verzia 2:

x << 3 = x * 8
x << 2 = x * 4

x & 2 je bud 2 alebo 0, podla toho ci x je parne alebo nie

42 & 2 = 2
(42 & 2) << 2 = 2 * 4 = 8
10 << 3 = 10 * 8 = 80

kedze vidime ze 10 << 3 ma posledne 4 bity nulove (10 je parne takze spodny bit je 0 + 3 bity posun)
mozeme tie dve cisla priamo scitat.

vysledok je 88.

verzia 3:

00001010 (10)
01010000 (10 << 3)

00101010 (42)
00000010 (2)
00000010 (42 & 2)
00001000 ((42 & 2) << 2)

01010000 (10 << 3)
00001000 ((42 & 2) << 2)
01011000 ((10 << 3) | ((42 & 2) << 2)) = 88

vystupuju tu tri cisla a 4 operacie, cele sa to deje do 8 bitov...

gl

Re:bitové operace
« Odpověď #4 kdy: 06. 09. 2016, 02:16:28 »
Děláš to zbyteně komplikovaně. a << b je to stejné, co a*2**b.

U 42 & 2 stačí 42 dvakrát vydělit dvěma. Druhé dělení je 21/2. Má zbytek. Výsledek je tedy 2.

Co to bylo za zaměstnání? V pythonu jsem bitové operace nikdy nepoužil.


Jenda

Re:bitové operace
« Odpověď #5 kdy: 06. 09. 2016, 03:52:42 »
x & 2 je bud 2 alebo 0, podla toho ci x je parne alebo nie
Ne, lichost je x&1.

Radovan.

Re:bitové operace
« Odpověď #6 kdy: 06. 09. 2016, 05:34:26 »
Kód: [Vybrat]
(10<<3) | ((42&2)<<2)
Do dvojkové soustavy nic převádět nemusíš, prostě si to rozlož na mocniny dvojky, to uměl v časech osmibitů z hlavy každý  ;D

Posun o jeden bit vlevo je násobení dvěma, doprava dělení dvěma:

10<<3 = 10*(2*2*2) = 10*8 = 80 = 64+16

42 = 32+8+2 ... dvojka tam je, takže 42&2 = 2

2<<2 = 2*(2*2) = 2*4 = 8

To | ti všechny jedničkové bity prostě ORne dohromady, 64+16+8 = 88

O půl šesté ráno chvilku po probuzení, a naučil mě to nějaký pan Sinclair v době, kdy jsem měl za sebou základní školu 8)

Radovan.

Re:bitové operace
« Odpověď #7 kdy: 06. 09. 2016, 05:55:41 »
P.S. Programátor nejsem, jen si občas zbastlím nějaký jednoduchý prográmek na věci které jsem líný dělat ručně.

franto

Re:bitové operace
« Odpověď #8 kdy: 06. 09. 2016, 08:16:23 »
Co to bylo za zaměstnání? V pythonu jsem bitové operace nikdy nepoužil.
osobne si myslim, ze to byl jenom jako test a nic takoveho v praci nedelaji. nevim kdy jsi byl naposledy na pohovoru, ale nekde se ptaji takove sracky, ktere ani sami nevyuzivaji.

Vodník

Re:bitové operace
« Odpověď #9 kdy: 06. 09. 2016, 09:36:25 »
I ve vyšších programovacích jazycích se implementují nízkoúrovňové protokoly nebo datové formáty a vznikající programy je potřeba ladit.  Takže bych rozhodně dvojkovou soustavu nevnímal jako něco, co dnes už programátoři nepotřebují.

uuuuuuuu

Re:Bitové operace ve vyšších jazycích
« Odpověď #10 kdy: 06. 09. 2016, 11:40:28 »
Podobné blbosti dávají i v Seznamu. Jenže pak nemají peníze, takže testem projde spíše jen neprogramátor a pokud ne, tak peníze každého průměrného odradí.

borekz

  • ****
  • 493
    • Zobrazit profil
    • E-mail
Re:Bitové operace ve vyšších jazycích
« Odpověď #11 kdy: 06. 09. 2016, 11:59:55 »
10 << 3 | (42 & 2) << 2 =
10 << 3 | 2 << 2 =
10 * 8 | 2 * 4 =
5 * 16 | 1 * 8 =
5 << 4 | 1 << 3 =
(5 << 4) + (1 << 3) = // "|" = "+", protože 3. bit v pravém termu nezasahuje do levého termu
80 + 8 = 88.

Nebo stačí méně kroků pokud si umím představit, že sudé číslo má nultý nulový bit.
10 << 3 | (42 & 2) << 2 =
10 << 3 | 2 << 2 =
10 << 3 | 1 << 3 =
(10 | 1) << 3 =
11 * 8 =
88
« Poslední změna: 06. 09. 2016, 12:03:54 od borekz »

borekz

  • ****
  • 493
    • Zobrazit profil
    • E-mail
Re:bitové operace
« Odpověď #12 kdy: 06. 09. 2016, 12:01:25 »
I ve vyšších programovacích jazycích se implementují nízkoúrovňové protokoly nebo datové formáty a vznikající programy je potřeba ladit.  Takže bych rozhodně dvojkovou soustavu nevnímal jako něco, co dnes už programátoři nepotřebují.
Když je tak důležitá, proč většina vyšších jazyků nemá binární literály ?

v

Re:bitové operace
« Odpověď #13 kdy: 06. 09. 2016, 12:29:25 »
I ve vyšších programovacích jazycích se implementují nízkoúrovňové protokoly nebo datové formáty a vznikající programy je potřeba ladit.  Takže bych rozhodně dvojkovou soustavu nevnímal jako něco, co dnes už programátoři nepotřebují.
Když je tak důležitá, proč většina vyšších jazyků nemá binární literály ?
tak zápis mantisa/ exponent/znaménko taky není moc vidět

JSH

Re:bitové operace
« Odpověď #14 kdy: 06. 09. 2016, 12:41:31 »
Když je tak důležitá, proč většina vyšších jazyků nemá binární literály ?
Protože převod z běžných hexa literálů zvládne i průměrně inteligentní šimpanz?