bitwise وليس المشغل
-
22-09-2019 - |
سؤال
لماذا عملية 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 = −1280 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = −1271 1 1 1 1 1 1 1 = −1
0 0 0 0 0 0 0 0 = 01 1 1 1 1 1 1 0 = −2
0 0 0 0 0 0 0 1 = 11 0 0 0 0 0 0 1 = −127
0 1 1 1 1 1 1 0 = 1261 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 القليل من التبديل لمكمل الشخص.