Przechowywanie i wyświetlanie wartości binarnych w C#
[[academy-video-youtube({"vid": "xkZa6IyqNwg", "start_time": "0", "title": "Przechowywanie i wyświetlanie wartości binarnych w C#", "creator": "Tim Corey", "length": "9m 20s"})]]
Binary to sposób, w jaki komputery faktycznie przechowują i przetwarzają dane, ale C# domyślnie używa bazy 10 dla wszystkiego, co widzisz na ekranie. Jeśli pracujesz z flagami bitowymi, protokołami sieciowymi, rejestrami sprzętowymi lub po prostu próbujesz zrozumieć, jak liczby są reprezentowane na poziomie maszyny, musisz wiedzieć, jak wprowadzać wartości binarne do C# i jak je wyświetlać w czytelnej formie.
W swoim wideo "Storing and Displaying Binary Values in C#", Tim Corey omawia trzecią lekcję w swojej serii o binarnym kodowaniu. Demonstruje, jak przechowywać literały binarne używając prefiksu 0b, jak konwertować liczby całkowite do ich binarnej reprezentacji łańcuchowej za pomocą Convert.ToString(), oraz jak dodawać zera wiodące do wyjścia dla estetycznego formatowania. Jeżeli śledzisz serię o kodowaniu binarnym lub pracujesz z danymi na niskim poziomie w C#, ta lekcja pokrywa praktyczne aspekty mechaniki.
Przechowywanie Literałów Binarnych w C
[0:00 - 1:50] Pierwsze pytanie, które porusza Tim, jest proste: jak wprowadzić liczbę binarną do zmiennej w C#? Odpowiedzią jest prefiks 0b, który każe kompilatorowi interpretować cyfry jako liczbę w bazie 2, zamiast domyślnie w bazie 10.
// Store binary 1001 (which is 9 in decimal)
int binaryValue = 0b1001;// Store binary 1001 (which is 9 in decimal)
int binaryValue = 0b1001;Bez prefiksu, 1001 byłoby interpretowane jako tysiąc jeden. Z 0b, jest traktowane jako cztery cyfry binarne reprezentujące wartość dziesiętną 9. Zera wiodące są opcjonalne. Zapis 0b00001001 jest identyczny z 0b1001, ale dłuższa forma może ułatwić odczyt pozycji bitów, gdy pracujesz z konkretnymi szerokościami bitowymi.
Typ zmiennej to standardowy int. Można również użyć uint (liczba całkowita nieznakowana), jeśli nie potrzebujesz wartości ujemnych, lub long dla przechowywania 64-bitowego. Składnia literału binarnego działa z każdym z typów całkowitoliczbowych.
Wyświetlanie Liczb w Formacie Binarnym
[1:50 - 3:48] Przechowywanie wartości binarnej to jedno. Zobaczenie jej w formacie binarnym na ekranie to co innego. Gdy wydrukujesz int z Console.WriteLine, C# wyprowadza reprezentację w podstawie 10. Dla 0b1001, oznacza to, że widzisz 9, a nie 1001.
Aby uzyskać reprezentację łańcuchową binarną, użyj Convert.ToString() z parametrem podstawy:
int binaryValue = 0b1001;
// Convert to binary string (base 2)
string representation = Convert.ToString(binaryValue, 2);
Console.WriteLine($"Base 10: {binaryValue}"); // Output: 9
Console.WriteLine($"Base 2: {representation}"); // Output: 1001int binaryValue = 0b1001;
// Convert to binary string (base 2)
string representation = Convert.ToString(binaryValue, 2);
Console.WriteLine($"Base 10: {binaryValue}"); // Output: 9
Console.WriteLine($"Base 2: {representation}"); // Output: 1001Drugi argument dla Convert.ToString() określa podstawę wyjściową. Obsługiwane wartości to 2 (binarny), 8 (oktalny), 10 (dziesiętny) i 16 (heksadecymalny). Tim demonstruje bazę 2, ale ta sama metoda obsługuje wszystkie cztery.
Dodawanie Zer Wiodących
[3:48 - 5:24] Surowe wyjście Convert.ToString(binaryValue, 2) pomija zera wiodące. Dla 0b1001, wynikiem jest łańcuch "1001", a nie "00001001". Gdy pracujesz z bajtami (8 bitów), 16-bitowymi wartościami czy rejestrami 32-bitowymi, widząc pełną szerokość z zerami wiodącymi, ułatwiasz natychmiastowy odczyt pozycji bitów.
Poprawka to PadLeft():
// Pad to 8 characters (one byte) with leading zeros
string padded = Convert.ToString(binaryValue, 2).PadLeft(8, '0');
Console.WriteLine(padded); // Output: 00001001// Pad to 8 characters (one byte) with leading zeros
string padded = Convert.ToString(binaryValue, 2).PadLeft(8, '0');
Console.WriteLine(padded); // Output: 00001001PadLeft(8, '0') zapewnia, że wyjście ma co najmniej 8 znaków długości, wypełniając jakiekolwiek brakujące pozycje po lewej znakiem '0'. Tim zauważa szczegół, że drugi argument to char (pojedyncze cudzysłowy), a nie łańcuch. To znak zero, a nie liczba zero, ponieważ PadLeft buduje łańcuch z pojedynczych znaków.
Dla reprezentacji 16-bitowej, zmień 8 na 16. Dla pełnego całkowitoliczbowego 32-bitowego, użyj 32. Szerokość zer powinna odpowiadać szerokości bitowej, nad którą się zastanawiasz.
Konwersja Każdego Licznika Całkowitego na Binarny
[5:24 - 7:28] Tim zauważa coś, co łatwo przeoczyć: nie musisz przechowywać wartości jako literału binarnego, aby zobaczyć jej reprezentację binarną. Każda liczba całkowita może zostać skonwertowana na wyjście binarne używając tego samego podejścia Convert.ToString():
// A regular base 10 integer
int decimalValue = 12;
// Convert to padded binary string
string binary = Convert.ToString(decimalValue, 2).PadLeft(8, '0');
Console.WriteLine($"Decimal: {decimalValue}"); // Output: 12
Console.WriteLine($"Binary: {binary}"); // Output: 00001100// A regular base 10 integer
int decimalValue = 12;
// Convert to padded binary string
string binary = Convert.ToString(decimalValue, 2).PadLeft(8, '0');
Console.WriteLine($"Decimal: {decimalValue}"); // Output: 12
Console.WriteLine($"Binary: {binary}"); // Output: 00001100Prefiks 0b jest dla sytuacji, gdy już masz wartość binarną i chcesz ją wprowadzić w formie binarnej. Dla zwykłych liczb całkowitych Convert.ToString() obsługuje konwersję. Obie ścieżki dają ten sam wynik dla tej samej wartości bazowej.
Jak C# Przechowuje Liczniki Całkowite w Pamięci
[7:28 - 9:20] Tim kończy detalem na temat tego, jak C# przechowuje liczniki całkowite wewnętrznie. Int w C# jest aliasem dla System.Int32, 32-bitowego licznika całkowitego znakowanego. Oznacza to, że każdy int zajmuje 32 bity w pamięci, niezależnie od tego, jak mała jest wartość. Przechowywanie 0b1001 (liczby 9) zajmuje te same 32 bity, co przechowywanie 0b01111111111111111111111111111111 (ponad dwóch miliardów).
// What's actually stored in memory for binaryValue = 0b1001
// 00000000 00000000 00000000 00001001
string fullRepresentation = Convert.ToString(binaryValue, 2).PadLeft(32, '0');
Console.WriteLine(fullRepresentation);// What's actually stored in memory for binaryValue = 0b1001
// 00000000 00000000 00000000 00001001
string fullRepresentation = Convert.ToString(binaryValue, 2).PadLeft(32, '0');
Console.WriteLine(fullRepresentation);To łączy się z tym, dlaczego ważne jest wybieranie odpowiedniego rozmiaru typu. Long (Int64) używa 64 bitów, podwajając rozmiar pamięci. Dla większości aplikacji, int (32 bity) pokrywa zakres, którego potrzebujesz. Ale jeśli pracujesz w środowiskach z ograniczoną pamięcią lub przetwarzasz miliony wartości, różnica między bajtem (8 bitów), short (16 bitów), int (32 bity) i long (64 bity) staje się istotna.
Podsumowanie: Kompletny Wzór
[9:07 - 9:15] Pełny wzór dla pracy z binarnymi w C# jest zwięzły. Przechowuj wartości używając prefiksu 0b, gdy masz dane wejściowe binarne. Wyświetl je używając Convert.ToString(value, 2) dla surowego wyjścia. Dodaj .PadLeft(width, '0'), gdy potrzebujesz formatowania ze stałą szerokością. I pamiętaj, że podstawa w jakiej są przechowywane to zawsze standardowy typ licznika całkowitego, z szerokością bitów określoną przez to, czy wybierasz bajt, short, int, czy long.
Wnioski
[9:15 - 9:20] Podsumowując: literały binarne używają prefiksu 0b, Convert.ToString(value, 2) tworzy łańcuch binarny, a PadLeft() dodaje zera wiodące dla wyświetlania o stałej szerokości. Wartość jest przechowywana w zwykłym typie licznikowym, a int zawsze zajmuje 32 bity niezależnie od wielkości liczby.
Te elementy budulcowe pojawiają się w następnych lekcjach serii, gdzie wartości binarne muszą być poprawnie formatowane dla operacji bitowych.
Porada przykład: Podczas debugowania operacji bitowych, dodaj do swojego wyjścia binarnego pełną szerokość twojego typu (8 dla bajtu, 16 dla short, 32 dla int). Widzenie wszystkich pozycji bitowych naraz ułatwia śledzenie operacji przesunięcia i maski. Metoda pomocnicza jak string ToBinary(int val) => Convert.ToString(val, 2).PadLeft(32, '0'); oszczędza powtarzające się pisanie.
Obejrzyj pełne wideo na jego YouTube Kanale i zdobądź więcej informacji na temat zrozumienia binarnego w C#.

