Bilangan Bulat Python
Operator Biner, Byte, dan Bitwise dengan Python
04. 40
Tandai sebagai Selesai
Bahan PendukungSlide Kursus Tutorial yang Direkomendasikan (. pdf) Contoh Kode (. ritsleting)
Jadilah Anggota untuk bergabung dalam percakapan
Pelengkap dua bukanlah skema yang rumit dan tidak dilayani dengan baik oleh apa pun yang panjang. Oleh karena itu, setelah pengantar ini, yang menjelaskan apa itu komplemen dua dan bagaimana menggunakannya, kebanyakan ada contoh
Pelengkap dua adalah cara setiap komputer yang saya kenal memilih untuk mewakili bilangan bulat. Untuk mendapatkan notasi negatif komplemen dua dari bilangan bulat, Anda menulis angka dalam biner. Anda kemudian membalikkan digit, dan menambahkan satu ke hasilnya
Misalkan kita bekerja dengan kuantitas 8 bit (demi kesederhanaan) dan misalkan kita ingin menemukan bagaimana -28 akan diekspresikan dalam notasi komplemen dua. Pertama kita menulis 28 dalam bentuk biner
00011100Lalu kita balikkan angkanya. 0 menjadi 1, 1 menjadi 0
Lalu kita tambahkan 1
11100100Begitulah cara seseorang menulis -28 dalam biner 8 bit
Konversi dari Komplemen Dua
Gunakan angka 0xFFFFFFFF sebagai contoh. Dalam biner, yaitu
1111 1111 1111 1111 1111 1111 1111 1111Apa yang bisa kita katakan tentang nomor ini? . Begitulah cara segala sesuatunya saling melengkapi. 1 di depan berarti angkanya negatif, 0 di depan berarti angkanya 0 atau positif
Untuk melihat negatif dari angka ini, kami membalik tanda angka ini. Tapi bagaimana melakukannya? . 17) bahwa untuk membalikkan tanda Anda cukup membalikkan bit (0 menjadi 1, dan 1 menjadi 0) dan menambahkan satu ke angka yang dihasilkan
Pembalikan dari bilangan biner itu, tentu saja
0000 0000 0000 0000 0000 0000 0000 0000_Kemudian kita tambahkan satu. 0000 0000 0000 0000 0000 0000 0000 0001Jadi negatif dari 0xFFFFFFFF adalah 0x00000001, lebih dikenal dengan 1. Jadi 0xFFFFFFFF adalah -1
Konversi ke Komplemen Dua
Perhatikan bahwa ini bekerja dua arah. Jika Anda memiliki -30, dan ingin merepresentasikannya dalam komplemen 2, Anda mengambil representasi biner dari 30
0000 0000 0000 0000 0000 0000 0001 1110_Balikkan digitnya
1111 1111 1111 1111 1111 1111 1110 0001Dan tambahkan satu
1111 1111 1111 1111 1111 1111 1110 0010_Dikonversi kembali menjadi hex, ini adalah 0xFFFFFFE2. Dan memang, misalkan Anda memiliki kode ini
#include int main() { int myInt; myInt = 0xFFFFFFE2; printf("%d\n",myInt); return 0; } _Itu akan menghasilkan output -30. Cobalah jika Anda suka
Aritmatika dengan Komplemen Dua
Salah satu sifat bagus dari komplemen dua adalah penambahan dan pengurangan dibuat sangat sederhana. Dengan sistem seperti komplemen dua, sirkuit penjumlahan dan pengurangan dapat disatukan, sedangkan jika tidak, mereka harus diperlakukan sebagai operasi terpisah.
Pada contoh di bagian ini, saya melakukan penjumlahan dan pengurangan dalam komplemen dua, tetapi Anda akan melihat bahwa setiap kali saya melakukan operasi sebenarnya dengan bilangan biner, saya selalu menjumlahkan
Contoh 1
Misalkan kita ingin menjumlahkan dua angka 69 dan 12. Jika kita menggunakan desimal, kita melihat jumlahnya adalah 81. Tapi mari kita gunakan biner, karena itulah yang digunakan komputer
111000110Bawa Baris111000111(69)111000112(12)111000113(81)Contoh 2
Sekarang misalkan kita ingin mengurangi 12 dari 69. Sekarang, 69 - 12 = 69 + (-12). Untuk mendapatkan negatif dari 12 kita ambil representasi binernya, balikkan, dan tambahkan satu
11100011_4Balikkan digitnya
11100011_5Dan tambahkan satu
11100011_6Yang terakhir adalah representasi biner untuk -12. Seperti sebelumnya, kita akan menjumlahkan kedua angka tersebut
111000117Carry Row111000111(69)111000119(-12)111001000(57)Kami menghasilkan 57, yaitu 69-12
Contoh 3
Terakhir, kita kurangi 69 dari 12. Mirip dengan operasi kita pada contoh 2, 12 - 69 = 12 + (- 69). Representasi komplemen keduanya dari 69 adalah sebagai berikut. Saya menganggap Anda sudah cukup memiliki ilustrasi pembalik dan menambahkan satu
111001001Jadi kita tambahkan angka ini menjadi 12. 111001002Bawa Baris111001003(12)111001004(-69)111001005(-57)Ini menghasilkan 12 - 69 = -57, yang benar
Mengapa Pembalikan dan Menambahkan Satu Bekerja
Balikkan dan tambahkan satu. Balikkan dan tambahkan satu. Itu berhasil, dan Anda mungkin ingin tahu alasannya. Jika Anda tidak peduli, lewati ini, karena ini hampir tidak penting. Ini hanya ditujukan bagi mereka yang penasaran mengapa teknik yang agak aneh itu sebenarnya masuk akal secara matematis
Membalikkan dan menambahkan satu mungkin terdengar seperti hal yang bodoh untuk dilakukan, tetapi sebenarnya itu hanyalah jalan pintas matematis dari perhitungan yang agak mudah.
Pinjaman dan Pengurangan
Ingat trik lama yang kita pelajari di kelas satu tentang "meminjam satu" dari tempat sepuluh di masa depan untuk melakukan pengurangan? . Sebagai contoh, saya akan menggunakan 93702 minus 58358
111001006Sekarang, lalu, apa jawaban untuk perhitungan ini? . Kita tidak dapat mengurangkan 8 dari 2, jadi kita akan meminjam angka dari tempat paling signifikan berikutnya (tempat puluhan) untuk menjadikannya 12 dikurangi 8. 12 dikurangi 8 adalah 4, dan kita catat 1 digit di atas kolom sepuluh untuk menandakan bahwa kita harus ingat untuk mengurangkan dengan satu pada iterasi berikutnya
111001007Iterasi berikutnya adalah 0 dikurangi 5, dan dikurangi 1, atau 0 dikurangi 6. Sekali lagi, kita tidak dapat melakukan 0 dikurangi 6, jadi kita meminjam dari angka paling penting berikutnya sekali lagi untuk membuat 10 dikurangi 6, yaitu 4
11100100_8Iterasi berikutnya adalah 7 dikurangi 3, dan dikurangi 1, atau 7 dikurangi 4. Ini adalah 3. Kita tidak perlu meminjam kali ini
11100100_9Iterasi berikutnya adalah 3 dikurangi 8. Sekali lagi, kita harus meminjam untuk mendapatkan 13 dikurangi 8, atau 5
1111 1111 1111 1111 1111 1111 1111 11110Iterasi berikutnya adalah 9 dikurangi 5, dan dikurangi 1, atau 9 dikurangi 6. Ini adalah 3. Kita tidak perlu meminjam kali ini
1111 1111 1111 1111 1111 1111 1111 11111Jadi 93702 dikurangi 58358 adalah 35344
Meminjam dan Relevansinya dengan Negatif Angka
Saat Anda ingin menemukan negatif suatu angka, Anda mengambil angka tersebut, dan menguranginya dari nol. Sekarang, misalkan kita benar-benar bodoh, seperti komputer, dan alih-alih hanya menulis tanda negatif di depan angka A saat kita mengurangkan A dari 0, kita benar-benar melakukan langkah-langkah mengurangkan A dari 0
Ambil perhitungan bodoh berikut dari 0 dikurangi 3
1111 1111 1111 1111 1111 1111 1111 111121111 1111 1111 1111 1111 1111 1111 111131111 1111 1111 1111 1111 1111 1111 111141111 1111 1111 1111 1111 1111 1111 111151111 1111 1111 1111 1111 1111 1111 11116Dan lain-lain, dan lain-lain. Kami akan berakhir dengan angka yang terdiri dari 7 di digit satu, 9 di setiap digit lebih penting daripada tempat 100
Sama di Biner
Kita bisa melakukan hal yang kurang lebih sama dengan biner. Dalam contoh ini saya menggunakan bilangan biner 8 bit, tetapi prinsipnya sama untuk bilangan biner 8 bit (karakter) dan bilangan biner 32 bit (ints). Saya mengambil angka 75 (dalam 8 bit biner yaitu 010010112) dan kurangi dari nol
Kadang-kadang saya berada dalam posisi di mana saya mengurangkan 1 dari nol, dan juga mengurangkan 1 pinjaman lainnya
________3______71111 1111 1111 1111 1111 1111 1111 111181111 1111 1111 1111 1111 1111 1111 111190000 0000 0000 0000 0000 0000 0000 000000000 0000 0000 0000 0000 0000 0000 0000111100011_4_______20000 0000 0000 0000 0000 0000 0000 000030000 0000 0000 0000 0000 0000 0000 000040000 0000 0000 0000 0000 0000 0000 00005Jika kami mau, kami bisa melangkah lebih jauh, tetapi tidak ada gunanya. Di dalam komputer, hasil perhitungan ini akan diberikan ke variabel delapan bit, sehingga setiap bit di luar yang kedelapan akan dibuang.
Dengan fakta bahwa kita hanya akan mengabaikan digit tambahan apa pun, apa bedanya pada hasil akhir dengan mengurangkan 01001011 dari 100000000 (satu bit diikuti oleh 8 bit nol) daripada 0? . Jika kita melakukan itu, kita berakhir dengan hasil yang sama
0000 0000 0000 0000 0000 0000 0000 0000_6Jadi untuk menemukan angka negatif n-bit di komputer, kurangi angka dari 0 atau kurangi dari 2n. Dalam biner, kekuatan dua ini akan menjadi satu bit diikuti oleh n nol bit
Dalam kasus angka 8-bit, itu akan menjawab dengan baik jika kita mengurangi angka kita dari (1 + 11111111) daripada 100000000
0000 0000 0000 0000 0000 0000 0000 0000_7Dalam biner, ketika kita mengurangi angka A dari angka semua 1 bit, yang kita lakukan adalah membalikkan bit A. Jadi operasi pengurangan sama dengan membalikkan bit angka. Lalu, kita tambahkan satu
Jadi, bagi komputer, mengambil angka negatif, yaitu mengurangkan angka dari 0, sama dengan membalikkan bit dan menambahkan satu, dari situlah triknya berasal