ماذا تفعل bitwise أو | المشغل يفعل؟
-
03-07-2019 - |
سؤال
كنت أقرأ عن علامات العلم ومشغلي bitwise ، وصادفت هذا الرمز:
enum file{
read = 1,
write = 2,
readandwrite = read | write
}
قرأت في مكان ما عن سبب وجود بيان شامل أو كيف لا يمكن أن يكون هناك & ، لكن لا يمكنني العثور على المقال. هل يمكن لأحد أن ينعش ذاكرتي وشرح المنطق؟
أيضا ، كيف يمكنني أن أقول و/أو؟ على سبيل المثال. إذا كان المنسدلة 1 = "Hello" و/أو REPODDOWN2 = "Hello" ....
شكرًا
المحلول
السؤال الأول:
أ |
يفعل قليلا أو ؛ سيتم تعيين القليل في النتيجة إذا تم تعيينه في القيمة الأولى أو القيمة الثانية. (يمكنك استخدامه على enums
لإنشاء قيم هي مجموعات من القيم الأخرى) إذا كنت ستستخدم قليلاً ، ولن يكون ذلك منطقيًا للغاية.
يتم استخدامه على النحو التالي:
[Flags]
enum FileAccess{
None = 0, // 00000000 Nothing is set
Read = 1, // 00000001 The read bit (bit 0) is set
Write = 2, // 00000010 The write bit (bit 1) is set
Execute = 4, // 00000100 The exec bit (bit 2) is set
// ...
ReadWrite = Read | Write // 00000011 Both read and write (bits 0 and 1) are set
// badValue = Read & Write // 00000000 Nothing is set, doesn't make sense
ReadExecute = Read | Execute // 00000101 Both read and exec (bits 0 and 2) are set
}
// Note that the non-combined values are powers of two, \
// meaning each sets only a single bit
// ...
// Test to see if access includes Read privileges:
if((access & FileAccess.Read) == FileAccess.Read)
في الأساس ، يمكنك اختبار ما إذا كانت بعض البتات في enum
تم تعيينها ؛ في هذه الحالة ، نختبر لمعرفة ما إذا كانت البتات المقابلة ل Read
تم تعيينها. قيم Read
و ReadWrite
كلاهما يجتاز هذا الاختبار (كلاهما لديه مجموعة بت صفر) ؛ Write
لن يكون (ليس لديه مجموعة صفر بت).
// if access is FileAccess.Read
access & FileAccess.Read == FileAccess.Read
// 00000001 & 00000001 => 00000001
// if access is FileAccess.ReadWrite
access & FileAccess.Read == FileAccess.Read
// 00000011 & 00000001 => 00000001
// uf access is FileAccess.Write
access & FileAccess.Read != FileAccess.Read
// 00000010 & 00000001 => 00000000
السؤال الثاني:
أعتقد عندما تقول "و/أو" ، تقصد "واحد ، الآخر أو كليهما". هذا هو بالضبط ما ||
(أو المشغل) يفعل. لقول "واحد أو آخر ، ولكن ليس كلاهما" ، كنت تستخدم ^
(الحصري أو Opertor).
جداول الحقيقة (صواب == 1 ، خطأ == 0):
A B | A || B
------|-------
OR 0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1 (result is true if any are true)
A B | A ^ B
------|-------
XOR 0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0 (if both are true, result is false)
نصائح أخرى
ما سبق أو هو قليلا أو ، ليس منطقيا أو. 1 | 2 يعادل 3 (بينما 1 و 2 = 0).
نرى http://en.wikipedia.org/wiki/bitwise_operation للحصول على تفسير أفضل حول عمليات bitwise.
أنواع التعداد. انظر إلى أنواع التعداد كقسم لعلامات البت ، فإنه يعطي مثالًا أو مثالًا على A وليس ب.
حسنًا ، هناك سؤالان مختلفان هنا ، ولكن للإجابة رقم 2 ، فإن المنطق أو كما هو موجود في معظم لغات البرمجة هو ما تعنيه و/أو ، على ما أعتقد.
if (dropdown == "1" || dropdown == "2") // Works if either condition is true.
حصريًا أو يعني "واحد أو آخر ولكن ليس كلاهما".