سؤال

كنت أقرأ عن علامات العلم ومشغلي 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.

حصريًا أو يعني "واحد أو آخر ولكن ليس كلاهما".

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