ما يعادل `if (x و (2 ^ y)) ثم في c#
-
03-07-2019 - |
سؤال
لدي هذا 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) .