Bitova negacia ~ – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Bitova negacia ~ – C / C++ – Fórum – Programujte.comBitova negacia ~ – C / C++ – Fórum – Programujte.com

 

mitti0
Newbie
2. 12. 2015   #1
-
0
-

Ahojte,

neviete mi niekto poradit preco ak zadam priklad na bitovu negaciu

#include <stdio.h>
#include <stdlib.h>

int main()
{
    unsigned int i = 10;

    printf("%d", (~i));

    system("pause");
    return 0;
}

tak nemam podla ocakavania vysledok ale -11????

Dakujem

Nahlásit jako SPAM
IP: 188.123.115.–
Radek Chalupa
~ Redaktor
+1
Super člen
3. 12. 2015   #2
-
0
-

#1 mitti
Protože unsigned int má (alespoň na většině platforem) 32 bitů a ty všechny se překlopí, takže máš zleva samé 1, a printf s %d to interpretuje jako int (signed), což přeteče a dostaneš se do záporných čísel- jak známo číslo s 32 bitovými jedničkamim v hexa pak 0xFFFFFFFF je při interpretaci jako int -1.

Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz


Nahlásit jako SPAM
IP: 89.177.51.–
peter
~ Anonymní uživatel
4009 příspěvků
3. 12. 2015   #3
-
0
-

Cili to musis andovat & 0xFF nebo 0x0F.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:d0c:491...–
3. 12. 2015   #4
-
0
-

Pro unsigned int je vhodnější

printf("%u", číslo);


hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
3. 12. 2015   #5
-
0
-

A kdyz pracujes s bitama, tak spis chces videt hexadecimalni cislo, takze  printf("0x%X", cislo);

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
mitti
~ Anonymní uživatel
26 příspěvků
3. 12. 2015   #6
-
0
-

Takze ak tomu dobre chapem, este je nutne urobit bitovy sucin aby som mal spravny vysledok. A bez toho to nie je mozne nijako vypisat?

#include <stdio.h>

int main()
{
    int i = 10;

    printf("Invertovane cislo je: %d\n", (~i)&0x0F);

    system("pause");
    return 0;
}
Nahlásit jako SPAM
IP: 159.51.236.–
KIIV
~ Moderátor
+43
God of flame
3. 12. 2015   #7
-
0
-

#6 mitti
 

  int cislo = 5;
  int negace = ~cislo;

  printf("0x%08X 0x%08X 0x%08X\n", cislo, negace, negace & 0xF);

ti vypise:

0x00000005 0xFFFFFFFA 0x0000000A

Ta negace neguje KAZDY BIT V CELEM 32b CISLE - a kdyz ho vypises se znamenkem, tak ti vyjde zaporne cislo, jelikoz jsi negoval i znamenkovy bit. Bez znamenka je to zase obrovske cislo.

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
3. 12. 2015   #8
-
0
-

Mimochodem, pokud chces negovat jen konkretni bity, muzes taky pouzit XOR (^)  ->    0x5 ^ 0xF == 0xA

Nemusis pak delat negaci a bitovou masku. XOR neguje jen pozice, kde ma logickou 1.

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
3. 12. 2015   #9
-
0
-

Jde to řešit i volbou vhodnějšího datového typu, např. byte. Někde existuje uint8 (tuším MS VS). Nebo méně závislý na platformě unsigned char. Pak bude mít proměnná velikost 1 Byte.
 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
mitti
~ Anonymní uživatel
26 příspěvků
3. 12. 2015   #10
-
0
-

OK....takze este jedna vec: cislo 5 negovane je 2

mam cislo 5 (deciamlna sustava), v binare to je: kedze sa jenda o 32bitove

0000 0000 0000 0000 0000 0000 0000 0101

negovane je:

1111 1111 1111 1111 1111 1111 1111 1010

krat binarny sucin 0xF co je

1111 1111 1111 1111 1111 1111 1111 1111

vysledok by mal byt predsa ten isty:

1111 1111 1111 1111 1111 1111 1111 1010

tak akoze je to zrazu 0x0000000A co je cislo 15.....

ale ved cislo 5 negovane je cislo 2 a toto ja potrebujem vysvetlit ako to zapisat ked zadam do programu cislo 5 a dam ho negovat preto mi nevyde cislo 2 + vysvetlenie ako je mozne ze vysledok negace & 0xF je 

0x0000000A nejako to rozpisat.....uz som z toho jelen (dakujem)

Nahlásit jako SPAM
IP: 159.51.236.–
KIIV
~ Moderátor
+43
God of flame
3. 12. 2015   #11
-
0
-

Logicky soucin znamena: "kdykoliv se na vstupu objevi logicka 0, vystup je take logicka 0"

1111 1111 1111 1111 1111 1111 1111 1010
&
0000 0000 0000 0000 0000 0000 0000 1111
=
0000 0000 0000 0000 0000 0000 0000 1010

negovane cislo 5 (101b) muze byt dva, jen za predpokladu, ze pocitas jen tri bity ->  010b ...

Muzes tedy udelat cislo ^ 0x7 => 0x2, nebo tu bitovou masku zmenit na  negovane & 0x7

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
mitti
~ Anonymní uživatel
26 příspěvků
3. 12. 2015   #12
-
0
-

OK, a teraz snad uz naposledy kedze v tom nie som moc zbehnuty, ako to cele pracuje:

mam cislo 5 kedze sa jedna o 32 bit tak to je:

0000 0000 0000 0000 0000 0000 0000 1010

negovane to je:

1111 1111 1111 1111 1111 1111 1111 0101

a maska je predsa 0x7 co je v binare

0000 0000 0000 0000 0000 0000 0000 0111

a vysledok je predsa:

0000 0000 0000 0000 0000 0000 0000 0101

tak ako je mozne ze C mi hodi ze je to 2, toto potrebujem vysvetlit

Nahlásit jako SPAM
IP: 159.51.236.–
3. 12. 2015   #13
-
0
-

5 binárně je 0101, po negaci je to 1010 ( = 0xa) pokud je maska 0x7 ( = 0111 binárně), zůstanou nejnižší tři bity, takže 0010 a to jsou 2. Masku uplatňuješ na výsledek bit. negace.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
mitti
~ Anonymní uživatel
26 příspěvků
3. 12. 2015   #14
-
0
-

chalani moc sa omluvam, som to zle previedol moja chyba.....dakujem za vyvedenie z omylu.....

Nahlásit jako SPAM
IP: 159.51.236.–
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, 16 hostů

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ý