Skip to content
Kembali ke Blog
Tutorial

Operasi Bitwise Lengkap: AND, OR, XOR, Shift, dan Bitmask

Kuasai operasi bitwise: AND, OR, XOR, shift, two's complement, bitmask, dan feature flags. Panduan praktis dengan contoh kode JavaScript, Python, Go, dan C.

17 menit baca

Operasi Bitwise Lengkap: AND, OR, XOR, Shift, dan Bitmask

Kamu membuka migrasi PostgreSQL lawas dan menemukan permissions & 0b100. Seorang rekan merilis sistem feature flag yang menumpuk 32 boolean ke dalam satu integer. Perhitungan subnet Kubernetes memuntahkan 192.168.1.0/24 dan kamu harus mengekstrak alamat jaringan lewat kode. Tiga situasi berbeda, satu keterampilan dasar di baliknya: operasi bitwise.

Mayoritas developer lapisan aplikasi tidak pernah menyentuh & atau ^ di webapp, sampai tiba-tiba harus. Panduan ini menelusuri enam operator bitwise, two’s complement, sembilan pola yang patut dihafal, dan jebakan khas tiap bahasa (terutama JavaScript). Kode dalam JS, Python, Go, dan C, semua contoh bisa dijalankan.

Buka Konverter Basis kami di tab lain. Beberapa bagian akan mengajakmu mengetik angka dan mengamati pola bit berubah.

Kenapa Operasi Bitwise Masih Relevan di 2026

Bahasa tingkat tinggi tidak membuat operasi bitwise usang, hanya menyembunyikan tempat kejadiannya. Beberapa tempat kamu bergantung padanya hari ini, sadar atau tidak:

  • Row-Level Security PostgreSQL menyimpan hak akses ACL (SELECT, INSERT, UPDATE, DELETE, dst) sebagai bitmap dalam satu integer.
  • Linux capabilities menggantikan model lama “root atau tidak sama sekali” dengan 40+ bit izin yang digabung pakai |.
  • Header algoritma JWT mengkodekan metode hash di field kecil tempat perbandingan level bit lazim dilakukan di lapisan library.
  • Snowflake, ULID, dan UUIDv7 mengemas timestamp, machine ID, dan nomor urut ke integer 64 atau 128 bit via left shift.
  • BITCOUNT dan BITOP Redis memaparkan primitif bitwise langsung ke kode aplikasi untuk estimasi kardinalitas dan A/B bucketing.
  • Pengolahan gambar membaca pixel RGBA 32 bit dan mengekstrak channel dengan & dan >>.

Operasi bitwise tetap O(1) di level instruksi CPU. Menumpuk 32 boolean ke satu integer menghemat 31 byte memori, dan yang lebih berguna: kamu bisa mengecek “apakah salah satu dari 32 flag ini aktif?” dalam satu tes != 0.

Dasar Biner yang Perlu Kamu Kuasai

Panduan ini mengasumsikan kamu sudah paham biner. Kalau butuh penyegaran, baca dulu Panduan Konversi Basis Angka lalu kembali.

Ringkasan istilah singkat:

  • Bit adalah 0 atau 1.
  • Nibble adalah 4 bit (satu digit heksadesimal).
  • Byte adalah 8 bit.
  • Word biasanya 32 atau 64 bit tergantung CPU.

Integer di sebagian besar bahasa punya lebar tetap: 8, 16, 32, 64. Lebar ini menentukan banyak hal di operasi bitwise karena shift bisa mendorong bit keluar batas, dan bit tanda duduk paling kiri pada integer bertanda.

Coba sekarang: buka Konverter Basis, ketik 170 sebagai desimal, dan lihat output biner. Kamu akan melihat 10101010, pola berselang yang akan muncul lagi beberapa kali nanti.

Enam Operator Bitwise

Semua bahasa mainstream memberi kamu enam operator yang sama dengan sedikit variasi sintaks. &, |, ^, ~, <<, >> bekerja sama persis di JavaScript, Python, Go, Rust, C, C++, Java, dan C#. JavaScript menambah satu: >>>, right shift tak-bertanda.

AND (&) — Penyaring Bit

Bit hasilnya 1 hanya jika kedua bit input bernilai 1.

ABA & B
000
010
100
111

Bayangkan AND sebagai gerbang: hanya bit yang nyala di kedua operand yang lolos. Kegunaan paling umum adalah masking, mempertahankan sebagian bit dan menolkan sisanya.

// Ekstrak 4 bit bawah (nibble kanan)
const value = 0b11010110;   // 214
const low4  = value & 0x0F; // 0b00000110 = 6

// Cek paritas
const isOdd = (n) => (n & 1) === 1;
isOdd(7);  // true
isOdd(42); // false
# Sama di Python
value = 0b11010110
low4 = value & 0x0F  # 6

def is_odd(n):
    return (n & 1) == 1

OR (|) — Penyala Bit

Bit hasilnya 1 kalau salah satu bit input adalah 1.

ABA | B
000
011
101
111

OR menggabungkan flag. Kalau READ = 1, WRITE = 2, EXECUTE = 4, maka READ | WRITE adalah 3, dua izin aktif sekaligus.

const READ  = 0b001;
const WRITE = 0b010;
const EXEC  = 0b100;

const rw = READ | WRITE;  // 0b011 = 3
READ, WRITE, EXEC = 0b001, 0b010, 0b100
rw = READ | WRITE  # 3

XOR (^) — Pembalik Bit

Bit hasilnya 1 saat bit input berbeda.

ABA ^ B
000
011
101
110

XOR punya tiga sifat aljabar yang menopang beberapa trik paling cerdas di computer science:

  • a ^ a = 0, apa pun di-XOR dengan dirinya sendiri jadi nol.
  • a ^ 0 = a, XOR dengan nol adalah identitas.
  • a ^ b ^ a = b, XOR adalah kebalikannya sendiri.

Sifat terakhir menjelaskan kenapa XOR muncul di mana-mana, dari parity check sampai stream cipher dan pertanyaan wawancara legendaris “cari angka unik di array di mana angka lain muncul dua kali”.

// Cari angka unik di array di mana yang lain muncul dua kali
const findUnique = (arr) => arr.reduce((a, b) => a ^ b, 0);
findUnique([4, 1, 2, 1, 2]);  // 4
from functools import reduce
from operator import xor
find_unique = lambda arr: reduce(xor, arr, 0)
find_unique([4, 1, 2, 1, 2])  # 4

NOT (~) — Pembalik Semua Bit

Operator unari ~ membalik setiap bit: 0 jadi 1, 1 jadi 0.

~0b00001111  // -16  (JavaScript memaksa 32 bit bertanda)
~5           // -6
~5  # -6
// Go memakai ^ sebagai NOT unari — awas simbol
var x int8 = 5
fmt.Println(^x)  // -6

~5 = -6 terdengar aneh untuk pemula di hampir semua bahasa mainstream. Alasannya adalah two’s complement, dibahas di bagian berikutnya. Untuk sekarang ingat saja: di bahasa mana pun yang pakai two’s complement untuk negatif (alias semua), ~x setara -(x + 1).

Left Shift (<<) — Pengali Pangkat Dua

x << n menggeser semua bit x ke kiri sebanyak n posisi, mengisi nol di kanan. Hasilnya sama dengan mengalikan x dengan 2ⁿ.

1 << 0   // 1    (2^0)
1 << 1   // 2    (2^1)
1 << 3   // 8    (2^3)
1 << 10  // 1024 (2^10 = 1 KiB)

// Membangun flag bit
const FLAG_ADMIN    = 1 << 0;
const FLAG_EDITOR   = 1 << 1;
const FLAG_REVIEWER = 1 << 2;

Keindahan 1 << n: menghasilkan angka dengan satu bit menyala di posisi n. Bit itu jadi flag.

Hati-hati overflow. Di JavaScript, 1 << 31 adalah -2147483648 (bukan 2147483648) karena operator bitwise JS bekerja pada integer 32 bit bertanda.

Right Shift (>> vs >>>) — Bertanda atau Diisi Nol?

Right shift menggeser bit ke kanan. Yang jadi pertanyaan: apa yang mengisi posisi kiri yang kosong?

  • >> (right shift aritmetika) mempertahankan bit tanda. Negatif tetap negatif.
  • >>> (right shift logika/tak-bertanda) mengisi dengan nol. Hanya JavaScript yang punya operator khusus untuk ini.
-8 >> 1   // -4   (tanda terjaga)
-8 >>> 1  // 2147483644  (bit tanda jadi data)

8 >> 1    // 4
8 >> 2    // 2

Di C, apakah >> pada tipe bertanda bersifat aritmetika atau logika tergantung implementation-defined. Kebanyakan kompilator pilih aritmetika, tapi jangan mengandalkannya tanpa cek. Go mengharuskan nilai shift berupa integer tak-bertanda dan memisahkan tipe bertanda/tak-bertanda secara eksplisit. Python tidak punya >>> karena tidak punya integer lebar tetap.

Two’s Complement — Cara Komputer Menyimpan Negatif

Kalau bit cuma 0 dan 1, bagaimana mengkodekan -5? Jawaban yang disepakati dunia sejak era 1960-an adalah two’s complement, dan semua CPU modern memakainya.

Pendekatan naif (cadangkan satu bit untuk tanda) punya dua masalah. Pertama, kamu kebagian +0 dan -0, canggung. Kedua, rangkaian penjumlahan dan pengurangan harus mengecek bit tanda, bikin hardware lebih rumit. Two’s complement menyelesaikan keduanya.

Aturannya pendek:

  1. Tulis representasi biner positif.
  2. Balik semua bit (ini “one’s complement”).
  3. Tambah 1.

Contoh lengkap, mengkodekan -5 dalam two’s complement 8 bit:

 5 biner:             0000 0101
 balik semua bit:     1111 1010   (ini -6 dalam two's complement!)
 tambah 1:            1111 1011   ← ini -5

Verifikasi pakai konverter kami: masukkan 251 (desimal) ke Konverter Basis dengan basis 10, output biner jadi 11111011. Dalam konteks 8 bit bertanda, 11111011 bernilai -5. Dalam 8 bit tak-bertanda, pola bit yang sama adalah 251. Bitnya identik; interpretasinya beda.

Ini menjelaskan kejutan ~5 = -6 tadi. NOT bitwise menghasilkan one’s complement. Two’s complement adalah one’s complement plus 1. Jadi:

~x    = -(x + 1)    // berlaku di bahasa two's complement mana pun
~5    = -6
~(-3) = 2

Untuk integer bertanda n bit, rentang yang bisa direpresentasikan dari -2ⁿ⁻¹ sampai 2ⁿ⁻¹ − 1. 8 bit bertanda mencakup -128 sampai 127. 32 bit bertanda mencakup kira-kira -2,1 miliar sampai +2,1 miliar.

Sembilan Pola Manipulasi Bit Wajib

Sembilan pola ini mencakup sekitar 95% manipulasi bit yang pernah kamu tulis. Hafalkan, dan kamu akan mengenali mereka di seluruh kode sistem.

Nyalakan Bit — x | (1 << n)

Nyalakan bit n, sisanya tidak berubah.

let flags = 0b0100;
flags = flags | (1 << 0);  // 0b0101

Matikan Bit — x & ~(1 << n)

Matikan bit n, sisanya tetap. ~(1 << n) adalah masker dengan semua bit menyala kecuali n.

let flags = 0b0111;
flags = flags & ~(1 << 1);  // 0b0101

Balik Bit — x ^ (1 << n)

Balik bit n tanpa peduli kondisi saat ini.

let flags = 0b0100;
flags = flags ^ (1 << 2);  // 0b0000
flags = flags ^ (1 << 2);  // 0b0100 lagi

Cek Bit — (x >> n) & 1

Mengembalikan 1 kalau bit n nyala, 0 sebaliknya. Bentuk setara: (x & (1 << n)) !== 0.

const flags = 0b0101;
const isBit2Set = (flags >> 2) & 1;  // 1

Isolasi Bit Terendah yang Nyala — x & -x

Menghasilkan nilai yang hanya menyimpan 1 paling kanan dari x. Trik ini bekerja karena dalam two’s complement -x sama dengan ~x + 1, yang membalik semua bit hingga bit nyala terendah.

const x = 0b10110100;
const lowest = x & -x;  // 0b00000100 = 4

Inilah trik inti di balik Fenwick tree (Binary Indexed Tree) untuk prefix sum O(log n).

Hitung Bit Nyala (popcount)

Menghitung jumlah 1 di sebuah integer. Sebagian besar bahasa sudah punya fungsi bawaan:

// JavaScript (versi manual)
const popcount = (n) => {
  let count = 0;
  while (n) { count += n & 1; n >>>= 1; }
  return count;
};
popcount(0b10110100);  // 4
# Python 3.10+
(0b10110100).bit_count()  # 4
// Go
import "math/bits"
bits.OnesCount(0b10110100)  // 4

Swap XOR Tanpa Variabel Temp

Trik klasik: tukar dua integer tanpa variabel ketiga. Jangan pernah pakai di produksi (lebih lambat dari variabel sementara dan rusak kalau a dan b menunjuk memori yang sama), tapi pantas dipahami.

let a = 5, b = 9;
a = a ^ b;  // a = 5 ^ 9
b = a ^ b;  // b = (5 ^ 9) ^ 9 = 5
a = a ^ b;  // a = (5 ^ 9) ^ 5 = 9
// a = 9, b = 5

Deteksi Pangkat Dua — (x & (x - 1)) === 0

Pangkat dua hanya punya satu bit nyala. Mengurangi 1 mematikan bit itu dan menyalakan semua bit di bawahnya. AND-nya jadi nol hanya untuk pangkat dua (dan 0 juga, makanya ada pengaman x > 0).

const isPow2 = (x) => x > 0 && (x & (x - 1)) === 0;
isPow2(16);  // true
isPow2(17);  // false

Cek Ganjil Cepat — x & 1

Di sebagian bahasa lebih cepat dari x % 2, di bahasa lain setara setelah optimasi kompilator. Cocok untuk hot loop atau saat keterbacaan bukan prioritas.

const isOdd = (x) => (x & 1) === 1;

Flag Bitmask di Kode Sungguhan

Di sini operasi bitwise naik kelas dari trik ke praktik.

32 Boolean dalam Satu Feature Flag

Alih-alih struct berisi 32 field boolean, tumpuk ke satu integer:

const FLAGS = {
  DARK_MODE:      1 << 0,
  NEW_NAV:        1 << 1,
  AI_SUGGESTIONS: 1 << 2,
  BETA_EDITOR:    1 << 3,
  // ... sampai 1 << 31
};

let userFlags = 0;
userFlags |= FLAGS.DARK_MODE | FLAGS.AI_SUGGESTIONS;  // aktifkan

if (userFlags & FLAGS.AI_SUGGESTIONS) {
  showSuggestions();
}

userFlags &= ~FLAGS.DARK_MODE;  // matikan

Menyimpan 32 boolean dalam 4 byte, dan kamu bisa query subset apa pun lewat satu AND. Database suka pola ini, satu kolom alih-alih 32.

Permission File Unix

chmod 755 adalah operasi bitwise murni. Tiga digit oktal memetakan ke tiga triplet bit:

7 = 111  (pemilik:  rwx)
5 = 101  (grup:     r-x)
5 = 101  (lainnya:  r-x)

Coba: buka Konverter Basis, set sumber ke oktal, masukkan 755, lihat output biner 111101101. Begitulah literal filesystem menyimpan field izin.

Menambah hanya “group write”:

const perms = 0o755;
const withGroupWrite = perms | 0o020;  // 0o775

Masking Subnet IP

Diberikan 192.168.1.10/24, ekstrak alamat jaringan dengan AND terhadap masker:

const ip      = 0xC0A8010A;  // 192.168.1.10
const mask    = 0xFFFFFF00;  // 255.255.255.0 (/24)
const network = ip & mask;   // 0xC0A80100 = 192.168.1.0

ID Terkemas: Snowflake

Snowflake dari Twitter mengemas timestamp, machine ID, dan nomor urut ke integer 64 bit:

┌─ 1 bit ─┬─── 41 bit ────┬─ 10 bit ─┬─ 12 bit ─┐
│  tanda  │   timestamp   │   mesin  │   seq    │
└─────────┴───────────────┴──────────┴──────────┘

Mengkodekan ID cukup dua shift dan dua OR:

const id = (BigInt(timestamp) << 22n) |
           (BigInt(machineId) << 12n) |
            BigInt(sequence);

Decode kebalikannya: shift kanan dan masker. Untuk memilih antara Snowflake, ULID, dan UUIDv7, lihat perbandingan ID terdistribusi kami.

Jebakan Khas Setiap Bahasa

JavaScript: Jebakan Koersi 32 Bit

JavaScript mengonversi operand ke integer 32 bit bertanda sebelum setiap operasi bitwise, lalu mengembalikan hasil ke Number. Nilai apa pun di atas 2³¹ − 1 = 2147483647 akan overflow:

2147483647 | 0   // 2147483647   (masih aman)
2147483648 | 0   // -2147483648  (overflow!)
4294967295 | 0   // -1           (semua bit nyala, dibaca bertanda)

Untuk kerja 64 bit, pakai BigInt. Operator bitwise-nya independen tanpa batas lebar:

(2n ** 40n) | 1n  // 1099511627777n

Bug Presedensi Operator

Salah satu bug bitwise paling sering di dunia nyata:

// Bug: terbaca sebagai (x & (1 == 0)) karena == mengikat lebih kuat dari &
if (x & 1 == 0) { /* ... */ }

// Benar: beri kurung
if ((x & 1) == 0) { /* ... */ }

Di C, JavaScript, Python, Go, dan turunannya, operator perbandingan mengikat lebih kuat dari AND/OR/XOR bitwise. Kalau ragu, beri kurung.

Tabel Perbandingan Bahasa

BahasaKoersi lebar>> negatifDukungan BigInt
JavaScriptMemaksa 32 bit bertanda; >>> tak-bertandaaritmetikaBigInt punya operator terpisah
PythonPresisi sembarang, tanpa lebar tetaparitmetikaBawaan
GoKetat; shift harus tak-bertandaaritmetika untuk tipe bertandamath/big
C/C++Mengikuti tipe; int, unsigned, dsb.implementation-defined untuk bertandaTidak ada bawaan
RustKetat; panic saat overflow di debugaritmetika untuk tipe bertandau128 / crate eksternal

Jebakan Lebar Tak Terbatas Python

Integer Python tidak punya lebar tetap, jadi logika two’s complement membentang “tak terhingga” ke kiri secara konseptual. Itulah sebabnya ~5 adalah -6 (bukan 250 atau 65530): Python memperlakukan hasilnya sebagai integer negatif, bukan pola bit lebar tetap. Kalau butuh semantik wrap-around, pasang masker eksplisit:

# Simulasi NOT 8 bit
(~5) & 0xFF  # 250

Fakta Performa di 2026

Mitos umum bilang operasi bitwise “selalu lebih cepat”. Di 2026, hanya separuh benar.

Kompilator sudah melakukan rewrite yang gampang. Optimizer modern mengubah x * 2 jadi x << 1 otomatis. Menulis x << 1 di kode aplikasi “demi kecepatan” cuma cargo cult, tidak membantu dan malah menurunkan keterbacaan.

Di mana kode bitwise benar-benar menang:

  • Hot loop numerik: popcount, hitung zero depan/belakang, mesin catur berbasis bitboard.
  • Struktur data padat: filter Bloom, roaring bitmap, Fenwick tree.
  • Register hardware dan memory-mapped I/O: embedded, kernel, firmware.
  • Primitif kriptografi: AES, ChaCha20, SHA, semuanya dibangun dari XOR, rotasi, dan shift.
  • Kompresi dan dekompresi: Huffman, run-length, integer terkemas.
  • Mesin database: indeks bitmap, format kolom terkemas seperti dictionary encoding Parquet.

Di mana bitwise tidak membantu: mengganti x % 2 dengan x & 1 di fungsi business logic yang dipanggil dua kali per request. Percepatannya tidak terukur, biaya keterbacaan nyata.

Satu-satunya kasus di mana manipulasi bit selalu menang adalah jejak memori. Menumpuk 32 flag ke int menghemat 31 byte dibanding 32 boolean. Pada skala besar (jutaan record pengguna, miliaran event), ini selisih antara layout cache-friendly dan badai cache miss.

Referensi Cepat

OperasiOperatorContohHasilKegunaan Umum
AND&0b1100 & 0b10100b1000Masker/ekstrak
OR|0b1100 | 0b10100b1110Gabung flag
XOR^0b1100 ^ 0b10100b0110Balik/deteksi beda
NOT~~0b1100...11110011Masker terbalik
Left shift<<1 << 38Kali 2ⁿ
Right shift>>16 >> 24Bagi 2ⁿ (bertanda)
Right shift tak-bertanda (JS)>>>-1 >>> 04294967295Perlakukan tak-bertanda
Nyalakan bit n|x | (1 << n)Hidupkan
Matikan bit n& ~x & ~(1 << n)Padamkan
Balik bit n^x ^ (1 << n)Flip
Cek bit n&(x >> n) & 10 atau 1Uji bit
Bit terendah nyala& -x & -xIsolasi
Pangkat 2&x > 0 && (x & (x-1)) == 0boolDeteksi

FAQ

Apa bedanya AND logis (&&) dan AND bitwise (&)?

AND logis (&&) bekerja pada nilai boolean utuh dan mendukung short-circuit evaluation; false && expr tidak pernah mengeksekusi expr. AND bitwise (&) bekerja pada setiap bit individu dari integer operand dan selalu mengevaluasi kedua sisi ekspresi. Pakai && untuk kontrol alur dan kondisi if, pakai & untuk masking, ekstraksi bit, dan pemeriksaan flag di bitmask.

Kenapa ~1 bernilai -2 di kebanyakan bahasa?

~1 bernilai -2 karena NOT bitwise membalik setiap bit, menghasilkan one’s complement. Dalam representasi two’s complement yang dipakai semua CPU modern, membalik seluruh bit x ekuivalen dengan -(x + 1). Maka ~1 = -2, ~0 = -1, ~(-1) = 0. Rumus kecil ini berlaku universal di JavaScript, Go, Rust, Java, dan C.

Apakah x << 1 sungguh lebih cepat dari x * 2?

x << 1 tidak lebih cepat dari x * 2 dalam praktik. Setiap kompilator modern (V8, JVM, GCC, LLVM, Go) mengenali pola x * 2 dan menerbitkan instruksi shift yang sama di tingkat mesin. Pakai x * 2 untuk kejelasan semantik; sisakan << untuk kasus saat kamu memang berpikir dalam bit, misalnya membangun bitmask atau mengemas field di header protokol.

Apakah JavaScript mendukung operasi bitwise 64 bit?

JavaScript tidak mendukung operasi bitwise 64 bit lewat operator standar &, |, ^, <<, >>. Semua memaksa operand ke integer 32 bit bertanda sebelum operasi, jadi nilai di atas 2³¹ − 1 akan overflow. Solusinya pakai literal BigInt (misal 1n << 40n) yang menawarkan operator bitwise presisi sembarang tanpa batas lebar. Kelemahannya: BigInt sekitar 10-20 kali lebih lambat dari Number biasa.

Bagaimana menghitung bit nyala secara efisien?

Cara paling efisien menghitung bit nyala adalah memakai fungsi bawaan bahasa: bits.OnesCount di Go, Integer.bitCount di Java, .bit_count() di Python 3.10+, dan intrinsik __builtin_popcount di GCC/Clang. Semuanya memetakan ke satu instruksi POPCNT di CPU x86 dan ARM modern. Hindari implementasi manual dengan loop kecuali kamu menargetkan hardware tanpa instruksi popcount.

Kapan pakai bitmask flag ketimbang struct boolean?

Pakai bitmask flag saat kamu perlu menyimpan banyak boolean secara padat (kolom database, protokol jaringan, format file biner) atau menguji kombinasi flag sekaligus dengan flags & REQUIRED_MASK. Pakai struct boolean saat field punya tipe berbeda, saat nama field penting untuk keterbacaan, atau saat jumlah flag kecil dan hemat memori bukan prioritas.

Apa yang terjadi jika shift melebihi lebar bit?

Undefined di C/C++. Di JavaScript, nilai shift di-modulo 32, jadi 1 << 32 adalah 1, bukan 0. Di Python tidak ada batas lebar, jadi 1 << 100 hanya integer yang lebih besar. Jangan pernah mengandalkan perilaku over-shift; masker sendiri nilai shift kalau perlu.

Kenapa ~5 di Python menghasilkan -6 bukan 2?

~5 di Python menghasilkan -6 karena integer Python tidak punya lebar tetap, sehingga two’s complement membentang konseptual ke tak terhingga ke kiri. Hasilnya mengikuti rumus umum ~x = -(x + 1), sama seperti JavaScript, Go, dan C. Kalau kamu butuh semantik wrap-around 8 bit yang menghasilkan 250, masker hasilnya sendiri: (~5) & 0xFF. Untuk 16 bit pakai & 0xFFFF, dan seterusnya.

Apakah enkripsi XOR aman?

Enkripsi XOR aman hanya dalam bentuk one-time pad: kunci acak sejati sepanjang pesan yang tak pernah digunakan ulang, secara teori informasi tak terpecahkan. Di luar skenario itu, “enkripsi XOR” dengan kunci pendek yang berulang sangat rapuh dan bisa dipecahkan dengan analisis frekuensi dasar. Cipher sungguhan seperti AES dan ChaCha20 memang memakai XOR di dalam, tapi sebagai satu langkah di antara puluhan ronde substitusi dan permutasi.

Bagaimana menulis angka negatif dalam two’s complement secara manual?

Tulis nilai positifnya dalam biner pada lebar target, balik setiap bit, tambah 1. Contoh: -5 di 8 bit = 00000101 → balik jadi 11111010 → tambah 1 → 11111011. Verifikasi lewat Konverter Basis dengan mengkonversi 251 (interpretasi tak-bertanda dari 11111011) dan memastikan output biner jadi 11111011.

Alat Terkait dan Bacaan Lanjutan

Artikel Terkait

Lihat semua artikel