سؤال

لدي هذا If حالة في VB6

If ( X AND ( 2 ^ Y)) Then 
  a = a + " 1" 
Else
  a = a + " 0" 

أريد نفس المكافئ في C#

حاولت القيام مثل

if ( X && ( 2 ^ Y))   // ERROR: && can not be used between int to int
  a = a + "1";
else
  a = a + "0";

لكن هذا الشيء يعطيني خطأ.

إليك رمز VB الكامل الذي أريد تحويله إلى C#

For i = 7 To 0 Step -1
        If intNumber And (2 ^ i) Then   ' Use the logical "AND" operator.
            bin = bin + "1"
        Else
            bin = bin + "0"
        End If
    Next

في الرمز أعلاه intNumber يمكن أن يكون أي رقم.

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

المحلول

ملحوظة: تم تحرير هذه الإجابة بشكل كبير بسبب نقص المعلومات في السؤال الأصلي. يعتمد هذا الإصدار من الإجابة الآن على السؤال المحدث مع معلومات كافية. للتاريخ ، تحقق من سجل التحرير.

شيئان:

  • && يستخدم بين التعبيرات المنطقية ، لتحديد المنطق والقيمة
  • ^ في C# يعني xor ، لا يتم رفعها إلى القوة. لم تسأل سؤالًا حول هذا ولكن كان من المحتم أن اكتشفت ذلك ^ لا يبدو أنه يقوم بعمله.

ال && يمكن معالجته بسهولة ، لأنه يمكن استبداله بفرد & بدلاً من ذلك ، الذي له معنى مزدوج ، اعتمادًا على السياق. إما أنه من المنطقي ومشغل التقييم الكامل (&& هو واحد قصير الدائرة) ، أو هو مشغل bitwise ، وهو ما تريد هنا.

ال ^ يختلف رغم ذلك. المعادلة الأكثر مباشرة هي الرياضيات, ، ولكن في هذه الحالة ، يتوفر بديل أفضل ، حافة بت.

حالة 2^X يمكن أن يعتقد من قم بتحويل مواضع X 1 بت إلى اليسار, ، و تتنقل بتات إلى اليسار لديها مشغل خاص بها ، << المشغل أو العامل.

لذا 2^X يمكن استبداله بـ 1 << X.

في هذا السياق ، إليك ما تريده لزيادة أكبر:

if ((intNumber & (1 << index)) != 0)
    a = a + "1";
else
    a = a + "0";

قم بتوصيل ذلك في حلقة كما لديك في مثالك السفلي ، وتحصل على هذا:

for (Int32 index = 7; index >= 0; index--)
    if ((intNumber & (1 << index)) != 0)
        bin = bin + "1";
    else
        bin = bin + "0";

الآن ، يولد السلاسل المتسلسلة مثل هذا ضغط GC ، لذلك ربما يجب عليك إما تخزين هذه الأرقام في أ Char صفيف ، وقم ببناء السلسلة بعد ذلك ، أو استخدم فئة StringBuilder. وإلا فإنك ستقوم ببناء 8 (من مثالي) سلاسل مختلفة الحجم ، وسوف تستخدم فقط وتظل الأخيرة. اعتمادًا على الظروف ، قد لا يشكل هذا مشكلة ، ولكن إذا اتصلت بهذا الرمز عدة مرات ، فسيتم إضافة ما يصل.

إليك نسخة أفضل من الكود النهائي:

Char[] digits = new Char[8]; // change if you want more/fewer digits
for (Int32 index = 0; index < digits.Length; index++)
    if ((intNumber & (1 << index)) != 0)
        digits[digits.Length - 1 - index] = '1';
    else
        digits[digits.Length - 1 - index] = '0';
bin = new String(digits);

ومع ذلك ، وهنا كيكر. هناك بالفعل طريقة لتحويل قيمة int32 إلى سلسلة مليئة بالأرقام الثنائية في .NET ، وهي طريقة تحويل. الفرق الوحيد هو أنه لا يضيف أي أصفار رائدة ، لذلك علينا أن نفعل ذلك بأنفسنا.

لذا ، إليك الرمز النهائي الذي يجب أن تستخدمه:

String bin = Convert.ToString(intNumber, 2).PadLeft(8, '0');

هذا يحل محل الحلقة بأكملها.

نصائح أخرى

يبدو أنه يستخدم VB للقيام بتاريخ bitwise وفي هذه الحالة ، لذلك ربما:

if ( (1 & ( 2 ^ 1)) != 0)

ومع ذلك ، هذا ثابت! هل أنت متأكد من أنه لا يوجد متغير في مكان ما؟

2 ^ 1 هو 3 ؛ 1 و 3 هو 1 ؛ لذلك سيكون هذا صحيحًا دائمًا

(على الأقل ، تحت C#، حيث ^ هو xor ؛ قيل لي أنه في VB ^ هو القوة ، لذلك 2 ^ 1 هو 2 ؛ 1 & 2 هو 0 ؛ لذلك سيكون هذا دائما خطأ ...)

لا أفهم بناء الجملة الشرطية ... هل تقصد 1 و (2 ^ 1))؟ (استخدم ampersand واحد فقط لإجراء مقارنات bitwise!) (ولكن هذا ثابت!)

ولكن إذا كانت A عبارة

 a +=  Conditional?  "1": "0";

محاولة

if ( 1 & ( 2 ^ 1))
  a = a + "1";
else
  a= a+ "0";

لا تستخدم الدورة الدموية القصيرة و. جرب هذا:

if (1 & (2 ^ 1) == 1)
{
    a = a + "1";
}
else
{
    a = a + "0";
}

منشورك لا معنى له على الإطلاق:

IF ( 1 AND ( 2 ^ 1)) Then 
 a = a + " 1" 
Else
  a = a + " 0"

2^1 = 2 = Math.Pow (2،1) 1 و 2 = 1 & 2 = 0

هذا المنطق يعني أن نتيجة IF ستكون دائمًا صفر.

إذا فهمت بشكل صحيح ما تريد القيام به هو في حلقة تفعل

if i is even
a = a + "0"
else
a = a+"1"

في هذه الحالة ، سيكون من الأفضل إذا كتبت للتو

for (int i=7;i>=0;i--)
{
   bin+=(i % 2).ToString();
}

أيضا لسلسلة concaterate في حلقة يجب عليك استخدام stringbuilder فئة لا + مشغل.

فقط للرجوع إليه ، نسخة أكثر إيجازًا من الكود النهائي لـ Lasse:

Char[] digits = new Char[8]; // change if you want more/fewer digits
int index = digits.Length;
var x = intNumber;
do {
    digits[--index] = '0' + (x & 1);
    x >>= 1;
} while (index);
bin = new String(digits);

في الأساس ، يستفيد هذا من حقيقة أنه يمكننا بسهولة تغيير الرقم بشكل صحيح مثل تحول القناع اليسرى. إذا فعلنا الأشياء بهذه الطريقة ، فإن نتيجة العملية هي دائمًا الرقم ، وهو نفس الرقم الذي نريده في سلسلةنا ، لذلك نقوم بتحويله فقط إلى حرف ASCII بإضافة "0" (أو 48 أو 0x30) .

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