تفسير طريقة tounsignedString
لقد رأيت أن هناك طريقة في عدد صحيح تحول Int إلى سلسلة نوع غير موقعة ، ولكن هناك عدة نقاط غير واضحة للغاية. بعد الاستعلام عن المعلومات ، أفهمها على النحو التالي:
/*** تحويل عدد صحيح إلى رقم غير موقّع. */ private Static String tounsignedString (int i ، int shift) {char [] buf = new char [32] ؛ int charpos = 32 ؛ int radix = 1 << Shift ؛ قناع int = radix - 1 ؛ do {buf [-charpos] = الأرقام [i & mask] ؛ أنا >>> = التحول ؛ } بينما (أنا! = 0) ؛ إرجاع سلسلة جديدة (buf ، charpos ، (32 - charpos)) ؛ }يمثل تحول المعلمة هنا النظام الثنائي. إذا كان ثنائيًا ، يكون التحول 2 ، أو الثمانين هو 8 ، ويتم حساب القناع المقابل على أنه 1 و 7. يستخرج الشخصيات المستمرة للشخصيات المقابلة في صفيف الأرقام من خلال القناع و I.
وبهذه الطريقة ، أقوم بإجراء عملية تحول يميني منطقي في كل مرة ، وأعلى بت تضيف صفر
بالإضافة إلى ذلك ، فإن اعتماد Do-Thile هو منع صفيف BUF من الحصول على قيمته عندما يكون هو نفسه 0.
تفسير طريقة tostring
// يمثل هذه الصفيف الجزء المكون من عشرة أرقام من الرقم ، وسيتم استخدام هذه الصفيف أدناه. char static final static [] digittens = {'0' ، '0' ، '0' ، '0' ، '0' ، '0' ، '0' ، '0' ، '0' ، '0' ، '1' ، '1' ، '1' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 2 '، 2' ، 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 '،' 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' ، 6 '، 6' ، 6 '، 6' ، 6 '، "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 '،' 8 '،' 8 '،' 9 '،' 9 '،' 9 '،' 9 '،' 9 '،' 9 '،' 9 '،' 9 '،} ؛ إذا تم الجمع بين كل جزء من الصفيف ، فيمكن الحصول على أعداد صحيحة من رقمين في جميع الحالات خلال 100. "9 '،' 0 '،' 1 '،' 2 '،' 3 '،' 4 '،' 5 '، 6' ، '7' ، '8' ، '9' ، '،' 1 '،' 2 '،' 3 '، "8 '،' 9 '،' 0 '،' 1 '،' 2 '،' 3 '،' 4 '،' 5 '،' 6 '،' 7 '، 8' ، '9' ، '0' ، '1' ، 2 '،' 3 '، 3' ، 4 '، 4' '، 4' '،" ، 3' ، '،' ، 3 '،' ، 3 '،' ، 3 '،' ، '، "، 3' ، '،' ، '، 3' ، "7 '،' 8 '،' 9 '،' 0 '،' 1 '،' 2 '،' 3 '،' 4 '،' 5 '،' 6 '، 7' ، '8' ، '9' ، '0 ، "6 '،' 7 '،' 8 '،' 9 '،' 0 '،' 1 '،' 2 '،' 3 '،' 4 '،' 5 ، '6' ، 7 '،' 8 '،' 9 '،' '،' 1 '، 2' ، 3 '، 4' ، '5 ،' 6 '،' 7 '،' ، ' السلسلة الثابتة العامة tostring (int i) {if (i == integer.min_value) // إضافة 1 هنا. في البداية ، لا أعرف ماذا يعني ذلك. في وقت لاحق ، إذا وجدت أنه تم العثور على رقم سالب ، فأنا بحاجة إلى إضافة علامة سلبية أمامه ، لذلك يجب إضافة حجم السلسلة 1.// تم تمرير الجزء الذي تم تمريره في الأوتار هنا إيجابي ، في الصفيف أدناه // MAP SIZE = (I <0)؟ sertingize (-i) + 1: outringsize (i) ؛ char [] buf = new Char [size] ؛ getChars (أنا ، الحجم ، buf) ؛ إرجاع سلسلة جديدة (0 ، الحجم ، buf) ؛ } static void getchars (int i ، int index ، char [] buf) {int q ، r ؛ int charpos = فهرس ؛ علامة char = 0 ؛ if (i <0) {sign = '-' ؛ i = -i ؛ } // للأعداد الصحيحة التي تزيد عن 65536 ، قم أولاً بإجراء المعالجة التالية ، // في هذه العملية ، في وحدات 100 ، أي أن الباقي يتم التحكم فيه في رقمين // هذا مجرد خرائط إلى صفيف من عشرة أرقام ومكتبها ، ويكتب رقمين في صفيف BUF في وقت واحد. هذا بلا شك أسرع بكثير من العثور على كل رقم بينما (i> = 65536) {q = i / 100 ؛ // حقًا: r = i - (Q * 100) ؛ r = i - ((q << 6) + (q << 5) + (q << 2)) ؛ أنا = س ؛ buf [-charpos] = digitones [r] ؛ buf [-charpos] = digittens [r] ؛ } // fall thru to fast mode for burnits bump intructs // assert (i <= 65536 ، i) ؛ // للأعداد الصحيحة التي تقل عن أو تساوي 65536 ، يمكن تنفيذ الجزء التالي مباشرة // ويتم تقسيم هذا المكان على 10 ، لكن التنفيذ لا يتم تقسيمه مباشرة // بدلاً من ذلك ، ابحث عن 52429/2^19 حوالي 0.1000 ... الرقم ، // ربما سيكون غير دقيق ، ثم اضرب المقسوم بمقدار 10 للحصول على أكثر من 10 أرقام // جزء. من خلال الرقم الذي يحتوي على أكثر من عشرة أرقام في هذا الجزء ، ستحصل على عدد الأرقام الفردية لـ (؛؛) {q = (i * 52429) >>> (16+3) ؛ r = i - ((q << 3) + (q << 1)) ؛ // r = i- (q*10) ... buf [-charpos] = digits [r] ؛ أنا = س ؛ إذا (i == 0) كسر ؛ } if (sign! = 0) {buf [-charpos] = sign ؛ }} Final Static int [] Sizetable = {9 ، 99 ، 999 ، 9999 ، 99999 ، 999999 ، 999999 ، 999999 ، 9999999 ، 99999999 ، Integer.Max_Value} ؛ // يجب تحسين هذا هنا ، ويتم تخزين أجزاء بيانات عدد صحيح من خلال sizetable // ، من واحد إلى 10 بت: 2147483647 ، // طريقة المعالجة هذه ثابتة بذكاء int }تفسير طريقة البناء العليا
int int int int int int (int i) {// hd ، الشكل 3-1 i | = (i >> 1) ؛ i | = (i >> 2) ؛ i | = (i >> 4) ؛ i | = (i >> 8) ؛ i | = (i >> 16) ؛ العودة أنا - (أنا >>> 1) ؛ }هذه الطريقة ممتعة للغاية. لقد حسابها بنفسي قبل أن أفهم جوهرها. تتمثل وظيفة هذه الطريقة في العثور على قيمة عدد صحيح يمثلها أكبر جزء من عدد صحيح. يتم تحقيق هذه الوظيفة هنا من خلال الإزاحة. دعونا نعطي مثالا بسيطا. بالنسبة إلى 128 ، يبلغ الثنائي 1000 0000. لنأخذه كمثال:
نقل 1 رقم
1000 0000
0100 0000
| -------------
نقل 2 رقمين
1100 0000
0011 0000
| --------------
نقل 4 بت
1111 0000
0000 1111
| --------------
نقل 8 بت
1111 1111
0000 0000
| --------------
Mobile 16 بت
1111 1111
0000 0000
| --------------
1111 1111
النتيجة النهائية هي كما ترون. تمتلئ جميع البتات التالية بـ 1 ، ويتم طرح جميع البتات التالية للحصول على عدد صحيح يمثله أعلى بت.
تحليل طريقة BitCount
public static int bitCount (int i) {// hd ، الشكل 5-2 i = i - ((i >>> 1) & 0x5555555) ؛ i = (I & 0x33333333) + ((i >>> 2) & 0x3333333) ؛ i = (i + (i >>> 4)) & 0x0f0f0f0f0f0f ؛ i = i + (i >>> 8) ؛ i = i + (i >>> 16) ؛ إرجاع i & 0x3f ؛ } كانت هذه الطريقة عديمة الفائدة حقًا لفترة طويلة للدراسة ، وبعد ذلك اكتشفت فكرة تقريبية:
في السطر الأول ، يتمثل التنفيذ في تجميع البتات الثنائية لنوع عدد صحيح إلى اثنين واثنين ، ثم حساب عدد 1 بين البتات. لا أعرف كيف تأتي هذه الصيغة ، ولكن هذا هو الحال بالفعل.
ينفذ السطر الثاني تجميع أربعة وأربعة أجزاء ثنائية من عدد صحيح ، ثم يحسب إضافة التحول داخل الجزء ، وهو 1001-> 10 + 01 = 11. ويعادل ثلاثة 1s. السطر الثالث هو تجميع ثمانية أجزاء ثنائية من عدد صحيح ، ثم إضافة عمليات إزاحة مماثلة للطريقة أعلاه. بالطبع ، يتم تحقيق ذلك من خلال بعض التحولات والعمليات المحددة.
التالي هي ستة عشر مجموعة وثلاثين مجموعة ، وأخيراً دمج الإحصاءات في الإحصاءات التي يمثلها الأرقام القليلة الماضية.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.