هل هناك طريقة لإجراء تحول بت دائري في C#؟
-
09-06-2019 - |
سؤال
أعلم أن ما يلي صحيح
int i = 17; //binary 10001
int j = i << 1; //decimal 34, binary 100010
ولكن، إذا قمت بالتحريك بعيدًا جدًا، فإن البتات تسقط من النهاية.يعتمد مكان حدوث ذلك على حجم العدد الصحيح الذي تعمل معه.
هل هناك طريقة لإجراء إزاحة بحيث تدور البتات إلى الجانب الآخر؟أنا أبحث عن عملية واحدة، وليس حلقة.
المحلول
إذا كنت تعرف حجم النوع، فيمكنك القيام بشيء مثل:
uint i = 17;
uint j = i << 1 | i >> 31;
...والتي من شأنها أن تؤدي إلى تحول دائري بقيمة 32 بت.
كتعميم على التحول الدائري لليسار n بت، على متغير بت b:
/*some unsigned numeric type*/ input = 17;
var result = input << n | input >> (b - n);
@ التعليق، يبدو أن لغة C# تتعامل مع البت العالي من القيم الموقعة بشكل مختلف.لقد وجدت بعض المعلومات حول هذا هنا.لقد قمت أيضًا بتغيير المثال لاستخدام uint.
نصائح أخرى
قبل عام واحد، كان عليّ تطبيق MD4 في أطروحتي الجامعية.هذا هو تنفيذي لإزاحة البت الدائرية باستخدام UInt32.
private UInt32 RotateLeft(UInt32 x, Byte n)
{
return UInt32((x << n) | (x >> (32 - n)));
}
كمرجع لكيفية القيام بذلك، تعمل هاتان الوظيفتان بشكل مثالي لتدوير أجزاء من 1/2 كلمة:
static public uint ShiftRight(uint z_value, int z_shift)
{
return ((z_value >> z_shift) | (z_value << (16 - z_shift))) & 0x0000FFFF;
}
static public uint ShiftLeft(uint z_value, int z_shift)
{
return ((z_value << z_shift) | (z_value >> (16 - z_shift))) & 0x0000FFFF;
}
سيكون من السهل تمديده لأي حجم معين.
يجب أن أعترف أنني قمت للتو بالبحث عن "تدوير بت C#" ووجدت ملف رابط إلى صفحة تحتوي على فئة Java يمكن تكييفها بسهولة مع لغة C#
لقد وجدت هذا أيضًا في Google Book وهي وظيفة C++ ذات سلوك مماثل
التطبيق الأكثر شهرة هو حل مشكلة جوزيفوس (كما تمت مناقشته في الرياضيات الخرسانية، انظر http://oeis.org/A006257).هذا في الأساس لغز بدون تطبيقات واضحة.في هذا الفيديو, ، بينت الروابط بين مسألة يوسيفوس من الدرجة الثانية والأشجار المتوازنة الكاملة.لا يزال هذا ليس تطبيقًا، ولكنه يتحرك قليلاً في الاتجاه الصحيح.