Násobné operátory v C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Násobné operátory v C – C / C++ – Fórum – Programujte.comNásobné operátory v C – C / C++ – Fórum – Programujte.com

 

14. 3. 2015   #1
-
0
-

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ů)

Nahlásit jako SPAM
IP: 46.227.9.–
oxidián0
Grafoman
14. 3. 2015   #2
-
0
-

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ě

Nahlásit jako SPAM
IP: 78.45.199.–
14. 3. 2015   #3
-
0
-

Myslel jsem třeba rozdíly mezi

& a &&

! a !! a !!!

a tak dále...

Nahlásit jako SPAM
IP: 46.227.9.–
KIIV
~ Moderátor
+43
God of flame
14. 3. 2015   #4
-
0
-

& 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 !...

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Grafoman
15. 3. 2015   #5
-
0
-

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.

Nahlásit jako SPAM
IP: 78.45.199.–
pirat7777
~ Anonymní uživatel
4 příspěvky
15. 3. 2015   #6
-
0
-

#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 ;)

Nahlásit jako SPAM
IP: 2a00:1028:96c6:272:b835:1...–
KIIV
~ Moderátor
+43
God of flame
15. 3. 2015   #7
-
0
-

#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)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
15. 3. 2015   #8
-
0
-

#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

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
oxidián0
Grafoman
15. 3. 2015   #9
-
0
-

To máš to samé jako napsat tuto větu:

V podsatě !nesouhlasím s tím co tu už bylo řečeno, že dvojité operátory !jsou k užitku :-)

Nahlásit jako SPAM
IP: 78.45.199.–
PiranhaGreg0
Stálý člen
15. 3. 2015   #10
-
0
-

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

Nahlásit jako SPAM
IP: 109.81.210.–
ingiraxo+15
Grafoman
15. 3. 2015   #11
-
0
-

#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)));
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
PiranhaGreg0
Stálý člen
15. 3. 2015   #12
-
0
-

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...

Nahlásit jako SPAM
IP: 109.81.210.–
pirat7777
~ Anonymní uživatel
4 příspěvky
15. 3. 2015   #13
-
0
-

Díky ;)

Teď by se mi ještě hodily i další znaky s podrobným popisem :D

Nahlásit jako SPAM
IP: 2a00:1028:96c6:272:b8c2:b...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 133 hostů

Podobná vlákna

Bitové operátory — založil Dotem

Clenske operatory — založil Alexej

Sablona - bin. operatory — založil Gadael

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý