سؤال

لماذا عملية bitwise (~0); المطبوعات -1؟ في الثنائي ، لا ينبغي أن يكون 0 1. لماذا ا ؟

هل كانت مفيدة؟

المحلول

أنت في الواقع قريب جدا.

في الثنائي ، لا ينبغي أن يكون 0 1

نعم ، هذا صحيح تمامًا عندما نتحدث عن بت واحد.

ومع ذلك ، و int التي هي القيمة 0 هي في الواقع 32 بت من جميع الأصفار! ~ يقلل جميع الأصفار 32 إلى 32 تلك.

System.out.println(Integer.toBinaryString(~0));
// prints "11111111111111111111111111111111"

هذا هو تمثيل الاثنين ل -1.

بصورة مماثلة:

System.out.println(Integer.toBinaryString(~1));
// prints "11111111111111111111111111111110"

وهذا هو ، ل 32 بت غير موقعة int في تمثيل اثنين تكملة ، ~1 == -2.


قراءة متعمقة:

  • متمم ثنائي
    • هذا هو النظام الذي تستخدمه Java (من بين أمور أخرى) لتمثيل القيمة العددية الموقعة في البتات
  • JLS 15.15.5 Bitwise Operator ~
    • "لاحظ أنه في جميع الحالات ، ~x يساوي (-x)-1"

نصائح أخرى

ما تقوله بالفعل هو ~ 0x00000000 وهذا يؤدي إلى 0xffffffff. ل (موقعة) int في جافا ، وهذا يعني -1.

يمكنك أن تتخيل أن يكون الجزء الأول في رقم موقّع ليكون -(2x -1) حيث x هو عدد البتات.

لذلك ، بالنظر إلى رقم 8 بت ، فإن قيمة كل بت (بالترتيب الأيمن إلى اليمين) هي:

-128 64 32 16 8 4 2 1

الآن ، في الثنائي ، من الواضح أن 0 كل 0s:

    -128 64 32 16 8 4 2 1
0      0  0  0  0 0 0 0 0 = 0

وعندما تفعل bitwise لا ~ كل من هذه 0S يصبح 1:

     -128 64 32 16 8 4 2 1
~0      1  1  1  1 1 1 1 1
 =   -128+64+32+16+8+4+2+1 == -1

هذا مفيد أيضًا في فهم الفائض:

     -128 64 32 16 8 4 2 1
126     0  1  1  1 1 1 1 0  =  126
 +1     0  1  1  1 1 1 1 1  =  127
 +1     1  0  0  0 0 0 0 0  = -128  overflow!

~ هو مشغل قليلا.

~0 = 1 which is -1 in 2's complement form  

http://en.wikipedia.org/wiki/two's_complement

بعض الأرقام في شكل اثنين مكملة ولا حكيمة لا ~ (تحتها مباشرة):

0 1 1 1 1 1 1 1 = 127
1 0 0 0 0 0 0 0 = −128

0 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = −127

1 1 1 1 1 1 1 1 = −1
0 0 0 0 0 0 0 0 = 0

1 1 1 1 1 1 1 0 = −2
0 0 0 0 0 0 0 1 = 1

1 0 0 0 0 0 0 1 = −127
0 1 1 1 1 1 1 0 = 126

1 0 0 0 0 0 0 0 = −128
0 1 1 1 1 1 1 1 = 127

لان ~ ليس انعكاسًا ثنائيًا ، إنه انعكاس صغير. سيكون الانعكاس الثنائي ! ويمكن (في Java) تطبيق فقط على القيم المنطقية.

في الترميز الثنائي القياسي ، 0 هو كل 0s ، ~ هو bitwise لا. جميع 1S هي (في أغلب الأحيان) -1 لأنواع عدد صحيح موقّع. لذلك لنوع بايت موقّع:

0xFF = -1    // 1111 1111
0xFE = -2    // 1111 1110
...
0xF0 = -128  // 1000 0000
0x7F = 127   // 0111 1111
0x7E = 126   // 0111 1110
...
0x01 = 1     // 0000 0001
0x00 = 0     // 0000 0000

إنه انعكاس ثنائي ، وفي المكمل الثاني -1 هو انعكاس ثنائي من 0.

0 هنا ليس قليلا. إنه بايت (على الأقل ؛ أو أكثر) - 00000000. باستخدام bitwise أو سيكون لدينا 11111111. هو -1 كمكتمل موقعة ...

ل 32 بت موقعة عدد صحيح

~00000000000000000000000000000000=11111111111111111111111111111111 (وهو -1)

أعتقد أن السبب الحقيقي هو أن ~ هو مكمل اثنين.

يعين JavaScript شخصية Tilde ، ~ ، من أجل تكملة الاثنين ، على الرغم من أن Tilde في معظم لغات البرمجة تمثل Tilde القليل من التبديل لمكمل الشخص.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top