Interpretasi metode TounsignedString
Saya melihat bahwa ada metode seperti itu di Integer untuk mengubah int menjadi string tipe yang tidak ditandatangani, tetapi ada beberapa poin yang tidak terlalu jelas. Setelah menanyakan informasi, saya memahaminya sebagai berikut:
/*** Konversikan bilangan bulat menjadi nomor yang tidak ditandatangani. */ private static string tounsignedString (int i, int shift) {char [] buf = new char [32]; int charpos = 32; int radix = 1 << shift; int mask = radix - 1; do {buf [-charpos] = digit [i & mask]; i >>> = shift; } while (i! = 0); mengembalikan string baru (buf, charpos, (32 - charpos)); }Pergeseran parameter di sini mewakili sistem biner. Jika biner, shift adalah 2, oktal adalah 8, dan topeng yang sesuai dihitung sebagai 1 dan 7. Terus mengekstrak karakter yang sesuai dalam array digit melalui topeng dan i.
Dengan cara ini, saya melakukan operasi pergeseran kanan logis setiap kali, dan bit tertinggi dilengkapi dengan nol, sehingga setelah pergeseran kanan logis terus menerus, saya akan menjadi 0
Selain itu, mengadopsi do-while adalah untuk mencegah array buf mendapatkan nilainya ketika saya sendiri adalah 0.
Interpretasi metode tostring
// Array ini mewakili bagian sepuluh digit dari angka, dan array ini akan digunakan di bawah ini. final static char [] digittens = {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', 2, 2, 2, 2, '1', '1', '1', '1 '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '4', '4', '4', '4', '4', '4', '4', '4', '' '' '', '' '', '5', '5', '5', '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', ' '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5' ',' 5 ',' 5 ',' 5 ',' 5 ',' 5 ',' 5 ',' 5, '5', '5', '6', '6', '5', '5', '5', '5', '5,' 5, '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '7', '7', '7', '7', '7', '7', 7 ', 7', 7 ', 7' 7 ', 7' 7 ', 7' 7 ', 7' '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', 7 ', 7', 7 ', 7', 7 ', 7', 7 '7', 7 ' '7', '7', '8', '8', '9', '9', '9', '9', '9', '9', '9', '9',}; // Array ini mewakili bagian satu digit dari angka, dan array ini akan digunakan di bawah ini. Jika setiap bagian dari array digabungkan, bilangan bulat dua digit dapat diperoleh dalam semua kasus dalam 100. Char statis akhir [] digiton = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '' ',' '', '', '', ',' 8 ',' 6 ',', '', ',', ',', ',', ',' 4 ',' 4 ',', '' '', ',' ',', ',' 4 ',' 4 ',', '' ',', ',' 4 ',' 4 ',', ' '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '' ',' '', '6', '' '', '' ',', ',' 8 ',', ',' 8 ',' 4 ',' '', ',' 4 ',' 4 '', ',', ' '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '' '', '' ',' '', '' ',' '', '' ',' '' ',' '' ',' 1 ',' '' '' ',' '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '' '', '' ',' '', '' ',' '', '' ',' '' ',' '' ',' '' ',' '' ',' '' '' ',' '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '9', '5', '6', '7', '9', '9', '9', '9', ',' Public Static String ToString (int i) {if (i == integer.min_value) // Tambahkan 1 di sini. Pada awalnya, saya tidak tahu apa artinya. Kemudian, jika saya menemukan bahwa angka negatif ditemukan, saya perlu menambahkan tanda negatif di depannya, sehingga ukuran string harus ditambahkan 1.// bagian yang dilewati dalam stringSize di sini positif, dalam array di bawah // peta int size = (i <0)? stringsize (-i) + 1: stringsize (i); char [] buf = arang baru [ukuran]; getchars (i, size, buf); mengembalikan string baru (0, ukuran, buf); } static void getChars (int i, int index, char [] buf) {int q, r; int charpos = indeks; tanda char = 0; if (i <0) {Sign = '-'; i = -i; } // Untuk bilangan bulat lebih dari 65536, pertama-tama lakukan pemrosesan berikut, // Dalam proses ini, dalam satuan 100, yaitu, sisanya dikendalikan dalam dua digit // ini hanya memetakan ke array sepuluh digit dan satu digit di atas, dan menulis dua digit dalam array buf sekaligus. Ini tidak diragukan lagi jauh lebih cepat daripada menemukan setiap digit sementara (i> = 65536) {q = i / 100; // Sungguh: r = i - (q * 100); r = i - ((q << 6) + (q << 5) + (q << 2)); i = q; buf [--charpos] = digiton [r]; buf [--charpos] = digittens [r]; } // jatuh ke mode cepat untuk angka yang lebih kecil // assert (i <= 65536, i); // Untuk bilangan bulat kurang dari atau sama dengan 65536, bagian berikut dapat dilakukan secara langsung // dan tempat ini dibagi dengan 10, tetapi implementasinya tidak secara langsung dibagi // sebagai gantinya, menemukan 52429/2^19 adalah sekitar 0,1000 ... // Divided dengan pembagian dengan 10, tetapi apa yang saya tidak tahu adalah mengapa itu tidak secara langsung // Divided dengan pembagian dengan 10, tetapi apa yang saya tahu adalah mengapa itu tidak secara langsung // Divided dengan pembagian dengan 10, tetapi apa yang saya tahu adalah mengapa itu tidak secara langsung // Divided dengan pembagian dengan 10, tetapi apa yang saya tahu adalah mengapa itu tidak secara langsung // Divided dengan pembagian dengan 10, tetapi apa yang saya tahu adalah mengapa itu tidak secara langsung // Divided dengan membagi dengan 10, tetapi apa yang saya tahu adalah mengapa itu tidak secara langsung // Divided dengan pembagian dengan 10, tetapi apa yang saya tahu adalah mengapa itu tidak secara langsung // Divided dengan membagi saya dengan 10, tetapi apa yang saya tahu adalah mengapa itu tidak secara langsung // dibagi secara langsung // // Mungkin itu tidak akurat, dan kemudian melipatgandakan pembagi dengan 10 untuk mendapatkan jumlah lebih dari 10 digit // bagian. Oleh i-nomor dengan lebih dari sepuluh digit di bagian ini, Anda mendapatkan jumlah satu digit untuk (;;) {q = (i * 52429) >>> (16+3); r = i - ((q << 3) + (q << 1)); // r = i- (q*10) ... buf [--charpos] = digit [r]; i = q; if (i == 0) break; } if (Sign! = 0) {buf [--Charpos] = tanda; }} final static int [] sizetable = {9, 99, 999, 9999, 99999, 999999, 999999, 999999, 9999999, 9999999, integer.max_value}; // Ini harus dioptimalkan di sini, dan bit data integer disimpan melalui sizetable //, dari satu hingga 10 bit: 2147483647, // Metode pemrosesan ini secara cerdik int stringsize statis (int x) {untuk (int i = 0; i ++) if (x = sizetable [i]) {for (int i = 0; i ++) if (x = Sizetable [i]) retrak }Interpretasi metode highestonebit
public static int highestonebit (int i) {// hd, Gambar 3-1 i | = (i >> 1); i | = (i >> 2); i | = (i >> 4); i | = (i >> 8); i | = (i >> 16); return i - (i >>> 1); }Metode ini sangat menarik. Saya menghitungnya sendiri sebelum saya mengerti esensinya. Fungsi metode ini adalah menemukan nilai bilangan bulat yang diwakili oleh bit terbesar dari bilangan bulat. Fungsi ini direalisasikan di sini melalui perpindahan. Mari berikan contoh sederhana. Untuk 128, biner adalah 1000 0000. Mari kita ambil sebagai contoh:
Pindahkan 1 digit
1000 0000
0100 0000
| -------------
Pindahkan 2 digit
1100 0000
0011 0000
| ------------
Pindahkan 4 bit
1111 0000
0000 1111
| ------------
Pindahkan 8 bit
1111 1111
0000 0000
| ------------
Mobile 16 bit
1111 1111
0000 0000
| ------------
1111 1111
Hasil akhirnya adalah seperti yang Anda lihat. Semua bit berikut diisi dengan 1, dan semua bit berikut dikurangi untuk mendapatkan bilangan bulat yang diwakili oleh bit tertinggi.
Analisis Metode Bitcount
public static int bitcount (int i) {// hd, Gambar 5-2 i = i - ((i >>> 1) & 0x55555555); i = (i & 0x333333333) + ((i >>> 2) & 0x333333333); i = (i + (i >>> 4)) & 0x0f0f0f0f0f0f; i = i + (i >>> 8); i = i + (i >>> 16); return i & 0x3f; } Metode ini benar -benar tidak berguna untuk belajar waktu yang lama, dan kemudian saya menemukan ide kasar:
Pada baris pertama, implementasinya adalah mengelompokkan bit biner dari tipe integer menjadi dua dan dua, dan kemudian menghitung jumlah 1 di antara dua bit. Saya tidak tahu bagaimana formula ini berasal, tetapi memang demikian.
Baris kedua mengimplementasikan pengelompokan empat dan empat bit biner bilangan bulat, dan kemudian menghitung penambahan shift dalam segmen, yaitu 1001-> 10 + 01 = 11. Ini setara dengan tiga 1s. Baris ketiga adalah mengelompokkan delapan bit biner bilangan bulat, dan kemudian menambahkan perpindahan yang mirip dengan metode di atas. Tentu saja, ini dicapai melalui beberapa pergeseran dan operasi spesifik.
Berikutnya adalah enam belas kelompok dan tiga puluh dua kelompok, dan akhirnya menggabungkan statistik ke dalam statistik yang diwakili oleh beberapa digit terakhir.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.