Ahoj,
poradíte mi prosím, kde najít význam násobných (bitových) operátorů ??
(=> význam jednoho, dvou a tří stejných operátorů)
Myslíš operátory pro bitový posun?
<< posune bit(y) doleva (a doplní ti zprava odpovídající počet nul)
>> posune bit(y) doprava (a doplní ti zleva odpovídající počet nul)
Význam z hlediska násobení - no asi takto
číslo dvě na druhou: 0b00000010 << 1 a dostaneš
0b00000100 tj. 4
číslo dvě na čtvrtou: 0b00000010 << 2 a dostaneš
0b00001000 tj. 4 tj. 8
číslo dvě na osmou: 0b00000010 << 3 a dostaneš
0b00010000 tj. 4 tj. 16
číslo dvě na osmou: 0b00000010 << 4 a dostaneš
0b00100000 tj. 4 tj. 32
doufám že jsem to napsal správně
& je logicky soucin po bitech, && je cisty logicky soucin (cislo ruzne od nuly se bere jako logicka 1, nula se bere jako logicka 0)
to samy pro | and ||
operatory jako !! a !!! budou proste !(!(!(...))). Dvoji negace je ve vysledku to same jako pred tim, troji negace je stejna jako !...
0b01 & 0b00 == 0b00
0b10 & 0b00 == 0b00
0b11 & 0b00 == 0b00
0b01 & 0b01 == 0b01
0b10 & 0b10 == 0b10
0b11 & 0b11 == 0b11
0b01 | 0b00 == 0b01
0b10 | 0b00 == 0b10
0b11 | 0b00 == 0b11
0b01 | 0b01 == 0b01
0b10 | 0b10 == 0b10
0b11 | 0b11 == 0b11
XOR:
0b01 ^ 0b00 == 0b01
0b10 ^ 0b00 == 0b10
0b11 ^ 0b00 == 0b11
0b01 ^ 0b01 == 0b00
0b10 ^ 0b10 == 0b00
0b11 ^ 0b11 == 0b00
U XORu jen zjišťuješ jestli bity jsou odlišné a pokud ano dáš 1.
#4 KIIV
S tou dvojí negací (!!) bych si nebyl až tak jistej...kdysi jsem to viděl v nějakým kódu...přece to tam nemohlo být jen tak...
Ale jinak asi není co řešit...
Myslel jsem si, že existujou i nějaký znaky, který mají speciální význam když se napíšou víckrát za sebe ;)
#6 pirat7777
je mozne, ze autor chtel usetrit: neco != 0 napsal !!neco (respektive vetsimou z toho vyleze 0 nebo 1 misto libovolneho cisla)
Kazdopadne sem se s tim nesetkal. Ani zadnej seznam operatoru pro c/c++ neobsahuje !! ... by to muselo byt jedine pretizeny v C++ a prvni by vratil nejaky typ, druhy by uz vracel treba bool (ale zase je to zatemnovani vyznamu)
#6 pirat7777
to spíš vypadá na překlep.. to máš to samé, jako 2 středníky na konci, taky stačí jeden, jen se autor překlep
! = negace
!! = negovaná negace (to samé jako bez negace)
!!! = to samé jako negace (!)
tohle je spíš opět překlep nebo "zmatení nepřítele", jde to napsat, ale nikdy jsem to v žádným kódu neviděl
Zkusil jsem grepnout svoje zdrojáky na více vykřičníků a něco to našlo. Např. v tomhle už trochu starším zdrojáku vypisuji hodnotu double v binární podobě. Díky !! jsem si ušetřil jednu podmínku .
#include <limits.h>
#include <stdio.h>
#define TYPE double
#define VALUE 12.34
int main(void) {
TYPE number = VALUE;
int i, j;
char * pom = (char *)&number;
for (i = sizeof(TYPE) - 1; i >= 0; i--) {
for (j = CHAR_BIT - 1; j >= 0; j--)
printf("%d", !!(pom[i] & (1 << j)));
printf(" ");
}
printf("\n");
return 0;
}
** se zase hojně používá pro vícenásobnou dereferenci nebo jako symbol pro ukazatel na ukazatel. ~~ lze myslím využít místo funkce floor, no a pak lze různé operátory skládat k sobě. Pokud u nich ale nedodržíš nějaké mezery, může dojít ke zmatení. Např --> nebo >>>=.
A nakonec jsou tu makra a přetěžování operátorů, kde lze zařídit téměř cokoliv. Např.
https://www.cise.ufl.edu/~manuel/obfuscate/pi.c
#10 PiranhaGreg
// chapu, ze tohle je kratsi, ale spise je lepsi
// zvolit promennou a tu potom vypsat nebo kdyz uz to
// takto musi byt, tak explicitni pretypovani,
// co cloveku na prvni pohled rekne, ze vysledek bude bool
printf("%d", bool(pom[i] & (1 << j)));
Psal jsem to v ANSI C, kde bool neexistuje. Výsledek měl být int. Pomocná proměnná mi v tomto případě přijde zbytečná. Ale jak jsem psal, je to kód už trochu staršího data. Dnes bych to napsal kultivovaněji...
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku