سؤال

تمرير عدد صحيح 2 إلى هذه الوظيفة ومن ثم العودة عدد صحيح وهو 4

x = 2;
x = rotateInt('L', x, 1); 

(shift الأيسر البتات 1)

على سبيل المثال:00000010 -> تدوير لليسار 1 -> 00000100

ولكن إذا كنت تمرير هذا:

x = rotateInt('R', x, 3); 

فإنه سيعود 64, 01000000

هنا هو رمز ، يمكن للشخص تصحيح الخطأ...شكرا

int rotateInt(char direction, unsigned int x, int y)
{
    unsigned int mask = 0;
    int num = 0, result = 0;
    int i;

    for (i = 0; i < y; i++)
    {     
        if (direction == 'R')
        {
            if ((x & 1) == 1)     
                x = (x ^ 129);
            else    
                x = x >> 1;
        }
        else if (direction == 'L')
        {
            if ((x & 128) == 1)  
                x = (x ^ 129);   
            else
                x = x << 1;
        }
    }
result = (result ^ x);
return result;   
}
هل كانت مفيدة؟

المحلول

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

C فقط لديه تحولات الحساب. إنه لا يقوم بتحولات منطقية ، ولا يدور. حسنًا ، لقد كذبت ، C يقوم بتحولات منطقية على INTs غير موقعة.

تدور ، حسناً ، بالضبط: إنه نفس التحول المنطقي ، باستثناء عندما تتحول إلى نهاية الرقم ، فإن الأرقام "تلتف" إلى الجانب الآخر. فمثلا

0010 المقيد الأيمن هو 0001. إذا كنت في الدوران الأيمن مرة أخرى ، فستحصل 1000. انظر 1 ملفوفة حولها أو تدويرها إلى الجانب الآخر من عدد صحيح.

الدوران الأيسر متشابه: 0100 ترك الدوران 1000 ترك الدوران 0001 ترك الدوران 0010 إلخ.

لاحظ أن الدورات لا تحافظ على علامة الإشارة كما هو الحال في التحول الأيمن الحساب.

لذلك ، C لديه فقط التحولات الحسابية. لذلك عليك تنفيذ الجزء "تدوير" يدويًا. لذلك ، خذ الدورة اليسرى. تريد:

  1. التقاط قيمة بتة اليسار. (هل هو 0 أو 1؟)
  2. قم بإشعال النار اليسرى
  3. قم بتعيين بت أكثر اليمين - وهو الشيء الذي تحدثنا عنه في الخطوة 1 (التي يجب تدويرها) إلى القيمة الصحيحة ، بناءً على ما التقطناه من الخطوة 1.

يجب أن تكون قادرًا على اكتشاف طريقة مماثلة للتناوب.

حظا طيبا وفقك الله!

نصائح أخرى

الجواب المقبول هو لطيف جدا ومباشرة إلى الأمام.

ومع ذلك, كنت أقوم ببعض K&R تمارين لتحديث ج ، و أردت أن أشارك في هذا استدارة إلى اليمين وظيفة التي قد تأتي في متناول اليدين الناس في محاولة لمعرفة بت الحكمة العمليات.

unsigned int rightRotateBits(unsigned int inputWord, int numberOfBitsToRotate) {
    int bitWidth = sizeof(inputWord) * 8;
    // Rotating 32 bits on a 32-bit integer is the same as rotating 0 bits;
    //   33 bits -> 1 bit; etc.
    numberOfBitsToRotate = numberOfBitsToRotate % bitWidth;

    unsigned int tempWord = inputWord;

    // Rotate input to the right
    inputWord = inputWord >> numberOfBitsToRotate;

    // Build mask for carried over bits
    tempWord = tempWord << (bitWidth - numberOfBitsToRotate);

    return inputWord | tempWord;
}

على اليسار تناوب فقط تمرير القيم بين -1 و -31 إلى bitAmount الحجة.

لاحظ أن هذه الدالة تفضل teachability/وضوح/البساطة أكثر كفاءة/الحمل/الاكتناز.

ألقِ نظرة على مشغلات التحول في بيتوريويس:

http://en.wikipedia.org/wiki/bitwise_operators#shifts_in_c.2c_c.2b.2b_and_java

يبدو أن الدوران الخاص بك إلى اليمين هو الصحيح. 1 سقط من الجانب وعاد مرة أخرى من اليسار؟

على أي حال ، ها هي مكوناتك:

http://tigcc.ticalc.org/doc/keywords.html#if - لتحديد ما إذا كان "L" أو "R"

http://tigcc.ticalc.org/doc/keywords.html#for - لحساب عدد المرات التي تتحول فيها

و

http://msdn.microsoft.com/en-us/library/f96c63ed(vs.80).aspx - لتحويله فعليًا

اذهب ، العب معها. ستعمل في النهاية!

نظرًا لعدم أخبرك أحد عن كيفية تنفيذ هذا ، يمكنك استخدام الجوهارات ، للاستوديو المرئي ، فهي _rotl ، _rotl64 ، _rotr ، _rotr64.

أوه ، ولكن الدوران والتحولات هما شيئان مختلفان!

أوصي باستخدام unsigned int.

#define DIR_LEFT 0
#define DIR_RIGHT 1

unsigned int rotateInt(unsigned int in, int amount, byte dir)
{
    return(dir == DIR_RIGHT ? (in >> amount) | ((in & ((0x01 << amount) - 1)) << (sizeof(unsigned int)*8 - amount)) : (in << amount)  | ((in & ~((sizeof(unsigned int)*8*8 - 1) >> amount)));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top