Saya menemukan potongan kode berikut
if( 0 != ( x ^ 0x1 ) )
encode( x, m );
Apa x ^ 0x1
artinya Apakah ini beberapa teknik standar?
c++
c
bit-manipulation
bitmask
Prajurit Kode
sumber
sumber
0 != (x ^ 1)
→ xor kedua sisi dengan 1 →(0 ^ 1) != (x ^ 1 ^ 1)
→ sederhanakan →1 != x
if (1 != x)
sulitnya menulis.type
darix
tidak diberikan - maka kita tidak tahu ini adalah bilangan bulat di C ini ++ ditandai masalah. Tentu, jika ini adalah C ataux
bilangan bulat, jawabannya mudah, tetapi itu tidak diberikan dan kemungkinan kelebihan bebanoperator ^
ada.Jawaban:
Operasi XOR (
x ^ 0x1
) membalikkan bit 0. Jadi ekspresi secara efektif berarti: jika bit 0 dari x adalah 0, atau bit x lainnya adalah 1, maka ekspresi itu benar.Sebaliknya ungkapan itu salah jika x == 1.
Jadi tesnya sama dengan:
dan karena itu (bisa dibilang) tidak perlu dikaburkan.
sumber
^
adalah operasi XOR bitwise0x1
adalah1
dalam notasi hexx ^ 0x1
akan membalikkan bit terakhirx
(lihat tabel kebenaran XOR di tautan di atas jika itu tidak jelas bagi Anda).Jadi, kondisi
(0 != ( x ^ 0x1 ))
akan benar jikax
lebih besar dari 1 atau jika bit terakhirx
adalah 0. Yang hanya menyisakan x == 1 sebagai nilai di mana kondisi tersebut akan salah. Jadi itu setara denganPS Neraka cara untuk menerapkan kondisi sederhana seperti itu, saya dapat menambahkan. Jangan lakukan itu. Dan jika Anda harus menulis kode yang rumit, tinggalkan komentar . Aku mohon padamu.
sumber
x==0
;4 ^ 0x1
itu benar, tetapi4==0
jelas salah.if (x == 0)
", bukankah itu sama denganx != 1
?x
adalah tipe integral. Jika afloat
ataudouble
, maka saya percaya ungkapan itu akan menghasilkan true for1.0 <= x < 2.0
. Dan jikax
adalah tipe yang ditentukan pengguna, ungkapan itu bisa kembali benar jikax
adalah Yugo, kanguru, ulang tahun komposer terkenal, atau angka apa pun yang berbagi setidaknya tiga digit dengan harga teh dalam mata uang dolar saat ini di Cina.operator^
untukfloat
/double
.Ini mungkin tampak sebagai penjelasan yang terlalu disederhanakan, tetapi jika seseorang ingin menjalaninya secara perlahan, maka di bawah ini:
^
adalah operator XOR bitwise dalam c, c ++ dan c #.The tabel kebenaran dari suatu xor b :
Jadi mari kita ilustrasikan
0 == ( x ^ 0x1 )
ekspresi pada tingkat biner:begitu:
sumber
Ini adalah operator eksklusif ATAU (XOR). Untuk memahami cara kerjanya, Anda dapat menjalankan kode sederhana ini
Outputnya adalah
Jadi ungkapan ini
akan sama dengan benar hanya ketika x! = 0x1.
Itu tidak mengubah x itu sendiri. Ini hanya memeriksa apakah x sama dengan 0 atau 1. rxpression ini dapat diubah menjadi
sumber
Hal cek yang
x
sebenarnya tidak0x1
...xor
ingx
dengan0x1
akan menghasilkan 0 hanya jikax
adalah0x1
... ini adalah trik lama banyak digunakan dalam bahasa assemblysumber
!= 1
?xor
pendekatan tersebut mengandung lebih sedikit kode mesin dan dieksekusi lebih cepat daripada penugasan yang sesuai untuk0
... namun pertanyaan ini berisixor
DAN perbandingan, jadi saya mungkin berpikir bahwa!=
mungkin lebih cepat. Namun saya tidak begitu yakin, perlu melihat beberapa kompiler yang dihasilkan perakitan.The
^
operator adalah bitwise XOR. Dan0x1
adalah bilangan1
, ditulis sebagai konstanta heksadesimal.Jadi,
x ^ 0x1
evaluasi ke nilai baru yang sama denganx
, tetapi dengan bit paling tidak signifikan terbalik.Kode tidak lebih dari membandingkan x dengan 1, dengan cara yang sangat berbelit-belit dan tidak jelas.
sumber
Operator xor (eksklusif atau) paling sering digunakan untuk membalikkan satu atau lebih bit. Operasi ini untuk menanyakan apakah salah satu bitnya adalah satu, ini mengarah ke tabel kebenaran berikut (A dan B adalah input, Y adalah output):
Sekarang tujuan dari kode ini tampaknya untuk memeriksa apakah bit terakhir adalah 1, dan yang lainnya adalah 0, ini sama dengan
if ( x != 1 )
. Alasan untuk metode yang tidak jelas ini mungkin karena teknik manipulasi bit sebelumnya telah digunakan dan mungkin digunakan di tempat lain dalam program.sumber
^
bitwisexor operator
dalamc
. Dalam kasus Anda x adalah xor'ed dengan 1. misalnyax
memiliki nilai 10, maka10d ^ 1d ===> 1010b ^ 0001b = 1011b, 1011b == 11d
kondisi menjadi benar.sumber
10 != 1010
10 (decimal) == 1010 (binary)
b
atau sesuatu di sana?Tes bitwise tampaknya merupakan kebingungan yang disengaja, tetapi jika data yang mendasarinya adalah data perusahaan dari sistem mainframe IBM, mungkin saja kode tersebut ditulis untuk mencerminkan dokumentasi asli. Format data IBM kembali ke tahun 1960-an dan sering menyandikan bendera sebagai bit tunggal dalam sebuah kata untuk menghemat penyimpanan. Saat format diubah, flag bytes ditambahkan di akhir catatan yang ada untuk menjaga kompatibilitas. Dokumentasi untuk catatan SMF, misalnya, mungkin menunjukkan kode bahasa rakitan untuk menguji tiga bit individual dalam tiga kata berbeda dalam satu catatan tunggal untuk memutuskan bahwa data tersebut adalah file input. Saya tahu sedikit tentang TCP / IP internal, tetapi Anda mungkin menemukan flag bit di sana, juga.
sumber
Operator ^ adalah bitwise-xor (lihat &, |). Hasil untuk pasangan bit adalah,
Jadi ungkapannya,
membalikkan / membalik bit ke 0 x (membiarkan bit lainnya tidak berubah).
Pertimbangkan apakah x dapat memiliki nilai selain 0x0 dan 0x1? Ketika x adalah bidang bit tunggal, ia hanya dapat memiliki nilai 0x0 dan 0x1, tetapi ketika x adalah int (char / short / long / etc), bit selain bit0 dapat memengaruhi hasil ekspresi.
Ekspresi seperti yang diberikan memungkinkan bit di samping bit0 untuk mempengaruhi hasilnya,
Yang memiliki kebenaran setara dengan ungkapan (sederhana) ini,
Perhatikan bahwa ungkapan ini hanya akan memeriksa bit0,
Jadi ekspresi yang disajikan benar-benar menggabungkan dua pemeriksaan ekspresi,
Apakah penulis hanya bermaksud memeriksa bit0, dan bermaksud menggunakan ungkapan ini,
Atau apakah penulis bermaksud menggandakan nilai untuk bit1-bitN dan xor dari bit0?
sumber
Saya menambahkan jawaban baru karena tidak ada yang benar-benar menjelaskan cara mendapatkan jawaban secara intuitif.
Kebalikannya
+
adalah-
.Kebalikannya
^
adalah^
.Bagaimana Anda mengatasi
0 != x - 1
untukx
? Anda di+ 1
kedua sisi:0 + 1 != x - 1 + 1
→1 != x
.Bagaimana Anda mengatasi
0 != x ^ 1
untukx
? Anda di^ 1
kedua sisi:0 ^ 1 != x ^ 1 ^ 1
→1 != x
.sumber
Saya kira ada bit lain atau nilai bit-field
x
, dan ini dimaksudkan untuk menguji bahwa hanya bit orde rendah yang ditetapkan. Dalam konteksnya, saya rasa ini adalah default, dan karena itu pengkodean ini dan beberapa yang terkaitm
(mungkin lebih mahal untuk dikodekan) dapat dilewati, karena keduanya harus merupakan nilai default, diinisialisasi dalam konstruktor atau serupa.Entah bagaimana dekoder harus dapat menyimpulkan bahwa nilai-nilai ini hilang. Jika mereka berada di akhir suatu struktur, itu dapat dikomunikasikan melalui
length
nilai yang selalu ada.sumber
XOR berguna dalam flag C # enum. Untuk menghapus satu flag dari nilai enum, perlu menggunakan xor operator (referensi di sini )
Contoh:
sumber
Ada banyak jawaban bagus tapi saya suka memikirkannya dengan cara yang lebih sederhana.
Pertama-tama. Pernyataan if hanya salah jika argumennya nol. Ini berarti membandingkan tidak sama dengan nol adalah sia-sia.
Sehingga meninggalkan kita dengan:
XOR dengan satu. Apa yang dilakukan XOR pada dasarnya mendeteksi bit yang berbeda. Jadi, jika semua bit itu sama, ia akan mengembalikan 0. Karena 0 itu salah, satu-satunya waktu ia akan kembali palsu adalah jika semua bit itu sama. Jadi akan salah jika argumennya sama, benar jika berbeda ... sama seperti tidak sama dengan operator.
Jika faktanya, satu-satunya perbedaan antara keduanya adalah yang
!=
akan mengembalikan 0 atau 1, sementara^
akan mengembalikan nomor berapa pun, tetapi kebenaran dari hasilnya akan selalu sama. Cara mudah untuk memikirkannya adalah."Penyederhanaan" akhir diubah
0x1
menjadi desimal yaitu 1. Oleh karena itu pernyataan Anda setara dengan:sumber
^ adalah operator XOR bitwise
Jika x = 1
di sini 0 == (x ^ 0x1)
Jika x = 0
di sini 0! = (x ^ 0x1)
Tabel kebenaran a xor b:
Kode itu hanya berarti
sumber
Teknik standar yang mungkin digunakan, di sini, adalah mengulangi sebuah idiom seperti yang muncul dalam konteks sekitarnya untuk kejelasan, daripada mengaburkannya dengan menggantinya dengan idiom yang secara aritmetika lebih sederhana tetapi tidak bermakna secara kontekstual.
Kode di sekitarnya mungkin sering membuat referensi
(x ^ 1)
, atau tes mungkin bertanya "jika bit 0 adalah sebaliknya, apakah bit-mask ini kosong?".Mengingat bahwa kondisi menyebabkan sesuatu untuk
encode()
diedit, mungkin dalam konteks keadaan default bit 0 telah terbalik oleh faktor-faktor lain, dan kami hanya perlu menyandikan informasi tambahan jika ada bit yang menyimpang dari standarnya (biasanya semua-nol ).Jika Anda mengeluarkan ungkapan di luar konteks dan bertanya apa fungsinya, Anda mengabaikan niat yang mendasarinya. Anda mungkin juga melihat output perakitan dari kompiler dan melihat bahwa itu hanya melakukan perbandingan kesetaraan langsung dengan 1.
sumber
Seperti yang saya lihat jawabannya sejauh ini melewatkan aturan sederhana untuk menangani
XOR
s. Tanpa merinci apa^
dan0x
artinya (danif
, dan!=
lain - lain), ekspresi0 != (x^1)
dapat dikerjakan ulang sebagai berikut dengan menggunakan fakta bahwa(a^a)==0
:sumber