การตีความ วิธี tounsignedstring
ฉันเห็นว่ามีวิธีการดังกล่าวในจำนวนเต็มเพื่อแปลง int เป็นสตริงประเภทที่ไม่ได้ลงชื่อ แต่มีหลายจุดที่ไม่ชัดเจนมาก หลังจากสอบถามข้อมูลฉันเข้าใจดังนี้:
/*** แปลงจำนวนเต็มเป็นหมายเลขที่ไม่ได้ลงชื่อ */ สตริงคงที่ส่วนตัว tounsignedString (int i, int shift) {char [] buf = char ใหม่ [32]; int charpos = 32; int radix = 1 << shift; mask int = radix - 1; ทำ {buf [-charpos] = ตัวเลข [i & mask]; i >>> = shift; } ในขณะที่ (i! = 0); ส่งคืนสตริงใหม่ (buf, charpos, (32 - charpos)); -การเลื่อนพารามิเตอร์ที่นี่แสดงถึงระบบไบนารี หากเป็นไบนารีกะคือ 2 แปดคือ 8 และหน้ากากที่สอดคล้องกันจะถูกคำนวณเป็น 1 และ 7 สกัดอักขระที่เกี่ยวข้องอย่างต่อเนื่องในอาร์เรย์ตัวเลขผ่านหน้ากากและ i
ด้วยวิธีนี้ฉันทำการดำเนินการเลื่อนขวาแบบลอจิคัลทุกครั้งและบิตสูงสุดจะเสริมด้วยศูนย์ดังนั้นหลังจากการเลื่อนขวาอย่างต่อเนื่องอย่างต่อเนื่องฉันจะกลายเป็น 0
นอกจากนี้การใช้สิ่งที่ต้องทำคือเพื่อป้องกันไม่ให้อาร์เรย์ BUF ได้รับมูลค่าเมื่อฉันเป็น 0
การตีความ วิธีการ TOSTRING
// อาร์เรย์นี้แสดงถึงส่วนสิบหลักของหมายเลขและอาร์เรย์นี้จะใช้ด้านล่าง char คงที่สุดท้าย [] digittens = {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '2', '2', '2' '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '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' '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', '8', '8', '9', '9', '9', '9', '9', '9', '9', '9',}; // อาร์เรย์นี้แสดงถึงส่วนเดียวของตัวเลขและอาร์เรย์นี้จะถูกนำมาใช้ด้านล่าง หากแต่ละส่วนของอาร์เรย์รวมกันสามารถรับจำนวนเต็มสองหลักในทุกกรณีภายใน 100 ตัวถ่านคงที่ [] digitones = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6' '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5' '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4' '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6' String String สาธารณะ toString (int i) {ถ้า (i == integer.min_value) // เพิ่ม 1 ที่นี่ ตอนแรกฉันไม่รู้ว่ามันหมายถึงอะไร ต่อมาหากฉันพบว่าพบจำนวนลบฉันต้องเพิ่มเครื่องหมายลบในด้านหน้าดังนั้นขนาดของสตริงจะต้องเพิ่ม 1.// ส่วนที่ผ่านในสตริงที่นี่เป็นค่าบวกในอาร์เรย์ด้านล่าง // map ขนาด int = (i <0)? stringsize (-i) + 1: stringsize (i); ถ่าน [] buf = ถ่านใหม่ [ขนาด]; getChars (i, size, buf); ส่งคืนสตริงใหม่ (0, ขนาด, buf); } โมฆะคงที่ getChars (int i, INT INDEX, char [] buf) {int q, r; int charpos = ดัชนี; เครื่องหมายถ่าน = 0; if (i <0) {sign = '-'; i = -i; } // สำหรับจำนวนเต็มมากกว่า 65536 ให้ทำการประมวลผลต่อไปนี้ครั้งแรก // ในกระบวนการนี้ในหน่วย 100 นั่นคือส่วนที่เหลือจะถูกควบคุมในสองหลัก // นี่เพียงแผนที่ไปยังอาร์เรย์สิบหลักและหลักเดียว สิ่งนี้เร็วกว่าการค้นหาแต่ละหลักในขณะที่ (i> = 65536) {q = i / 100; // จริง ๆ : r = i - (q * 100); r = i - ((q << 6) + (q << 5) + (q << 2)); i = q; buf [-Charpos] = digitones [r]; buf [-Charpos] = digittens [r]; } // ตกสู่โหมดเร็วสำหรับตัวเลขที่เล็กกว่า // ยืนยัน (i <= 65536, i); // สำหรับจำนวนเต็มน้อยกว่าหรือเท่ากับ 65536 ส่วนต่อไปนี้สามารถดำเนินการได้โดยตรง // และสถานที่นี้แบ่งออกเป็น 10 แต่การใช้งานไม่ได้ถูกแบ่งโดยตรง // แทนพบ 52429/2^19 คือประมาณ 0.1000 ... // บางทีมันอาจจะไม่ถูกต้องและจากนั้นคูณตัวหารด้วย 10 เพื่อให้ได้จำนวนมากกว่า 10 หลัก // ส่วน โดย i- จำนวนที่มีมากกว่าสิบหลักในส่วนนี้คุณจะได้รับตัวเลขหลักเดียวสำหรับ (;;) {q = (i * 52429) >>> (16+3); r = i - ((q << 3) + (q << 1)); // r = i- (q*10) ... buf [-Charpos] = ตัวเลข [r]; i = q; if (i == 0) break; } if (sign! = 0) {buf [-Charpos] = sign; }} int คงที่สุดท้าย [] sizetable = {9, 99, 999, 9999, 99999, 999999, 999999, 999999, 9999999, 9999999, integer.max_value}; // สิ่งนี้ควรได้รับการปรับให้เหมาะสมที่นี่และบิตของข้อมูลจำนวนเต็มถูกเก็บไว้ผ่าน sizetable // จากหนึ่งถึง 10 บิต: 2147483647, // วิธีการประมวลผลนี้เป็น stringsize แบบคงที่อย่างชาญฉลาด (int x) {สำหรับ (int i = 0; -การตีความ วิธีการสูงที่สุด
public static int สูงสุด oneBit (int i) {// hd, รูปที่ 3-1 i | = (i >> 1); i | = (i >> 2); i | = (i >> 4); i | = (i >> 8); i | = (i >> 16); return i - (i >>> 1); -วิธีนี้น่าสนใจมาก ฉันคำนวณมันเองก่อนที่ฉันจะเข้าใจสาระสำคัญของมัน ฟังก์ชั่นของวิธีนี้คือการค้นหาค่าของจำนวนเต็มที่แสดงโดยบิตที่ใหญ่ที่สุดของจำนวนเต็ม ฟังก์ชั่นนี้รับรู้ที่นี่ผ่านการกระจัด ยกตัวอย่างง่ายๆ สำหรับ 128 ไบนารีคือ 1,000 0000 ลองมาดูตัวอย่าง:
ย้าย 1 หลัก
1,000 0000
0100 0000
-
ย้าย 2 หลัก
1100 0000
0011 0000
-
ย้าย 4 บิต
1111 0000
0000 1111
-
ย้าย 8 บิต
1111 1111
0000 0000
-
มือถือ 16 บิต
1111 1111
0000 0000
-
1111 1111
ผลลัพธ์สุดท้ายคืออย่างที่คุณเห็น บิตต่อไปนี้ทั้งหมดเต็มไปด้วย 1 และบิตต่อไปนี้ทั้งหมดจะถูกหักเพื่อให้ได้จำนวนเต็มที่แสดงด้วยบิตสูงสุด
การวิเคราะห์ วิธี BitCount
สาธารณะคงที่ int bitcount (int i) {// hd, รูปที่ 5-2 i = i - ((i >>> 1) & 0x55555555); i = (i & 0x3333333333) + ((i >>> 2) & 0x333333333); i = (i + (i >>> 4)) & 0x0f0f0f0f0f0f0f; i = i + (i >>> 8); i = i + (i >>> 16); กลับฉัน & 0x3f; - วิธีนี้ไร้ประโยชน์เป็นเวลานานในการศึกษาและต่อมาฉันก็คิดว่าเป็นความคิดคร่าวๆ:
ในบรรทัดแรกการใช้งานคือการจัดกลุ่มบิตไบนารีของประเภทจำนวนเต็มเป็นสองและสองจากนั้นนับจำนวน 1 ในสองบิต ฉันไม่รู้ว่าสูตรนี้มาจากไหน แต่เป็นกรณีนี้
บรรทัดที่สองใช้การจัดกลุ่มของบิตไบนารีสี่และสี่บิตของจำนวนเต็มจากนั้นคำนวณการเพิ่มการเปลี่ยนแปลงภายในเซ็กเมนต์ซึ่งคือ 1001-> 10 + 01 = 11 มันเทียบเท่ากับสาม 1s บรรทัดที่สามคือการจัดกลุ่มบิตไบนารีแปดบิตของจำนวนเต็มจากนั้นเพิ่มการกระจัดคล้ายกับวิธีการข้างต้น แน่นอนว่านี่คือความสำเร็จผ่านการเปลี่ยนแปลงและการดำเนินงานที่เฉพาะเจาะจง
ถัดไปคือกลุ่มสิบหกและสามกลุ่มและในที่สุดก็รวมสถิติเข้ากับสถิติที่แสดงด้วยตัวเลขสองสามหลักสุดท้าย
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น