Dalam sesetengah senario pengaturcaraan, data binari menjadi perlu untuk memanipulasi pada tahap bit. Satu tugas sedemikian melibatkan penukaran lapan nilai boolean kepada satu bait dan sebaliknya. Artikel ini meneroka kaedah yang cekap untuk mencapai penukaran ini.
Pendekatan paling mudah untuk menggabungkan nilai boolean kepada bait ialah melalui operasi bitwise. Setiap nilai boolean sepadan dengan kedudukan bit dalam bait, dengan 'true' diberikan kepada '1' dan 'false' kepada '0'. Dengan mengalihkan '1' ke kiri secara berulang berdasarkan nilai boolean dan ORingkannya dengan hasil terkumpul, bait boleh dibina. Proses ini ditunjukkan dalam fungsi berikut:
unsigned char ToByte(bool b[8]) { unsigned char c = 0; for (int i=0; i < 8; ++i) if (b[i]) c |= 1 << i; return c; }
Sebaliknya, menyahkod bait kepada nilai boolean individu memerlukan proses berulang yang serupa. Dengan mengalihkan bait ke kanan dan membandingkannya dengan topeng '1', setiap kedudukan bit boleh diekstrak dan diberikan nilai boolean 'true' untuk '1' dan 'false' untuk '0'. Fungsi berikut melaksanakan proses ini:
void FromByte(unsigned char c, bool b[8]) { for (int i=0; i < 8; ++i) b[i] = (c & (1<<i)) != 0; }
Pendekatan alternatif dan berpotensi lebih elegan menggunakan medan bit dan kesatuan. Dengan mentakrifkan struktur dengan lapan medan 1-bit, setiap nilai boolean boleh ditugaskan terus ke medan yang sepadan. Menyatukan struktur ini dengan aksara yang tidak ditandatangani membolehkan penukaran mudah antara kedua-dua jenis data. Ini dicapai melalui coretan kod berikut:
struct Bits { unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1; }; union CBits { Bits bits; unsigned char byte; };
Dengan memberikan nilai kepada mana-mana ahli kesatuan, penukaran dilakukan secara automatik. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa susunan medan bit dan padding berpotensi mungkin berbeza-beza bergantung pada pelaksanaan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Antara Lapan Nilai Boolean dan Satu Bait Dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!