كيفية استخراج أربعة ints قصيرة غير موقعة من int طويلة طويلة؟

StackOverflow https://stackoverflow.com/questions/148225

سؤال

لنفترض أن لديّ int طويلًا واحدًا وأريد أخذ أجزاء منه وإنشاء أربعة ints قصيرة غير موقعة منه.

ترتيب معين لا يهم كثيرا هنا.

أعلم عمومًا أنني بحاجة إلى تحويل البتات والاقتطاع إلى حجم int القصير غير الموقع.لكنني أعتقد أنني قد أرتكب بعض الأخطاء الغريبة في مكان ما، لذلك أسأل.

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

المحلول

#include <stdint.h>
#include <stdio.h>

union ui64 {
    uint64_t one;
    uint16_t four[4];
};

int
main()
{
    union ui64 number = {0x123456789abcdef0};
    printf("%x %x %x %x\n", number.four[0], number.four[1],
                            number.four[2], number.four[3]);
    return 0;
}

نصائح أخرى

(unsigned short)((((unsigned long long int)value)>>(x))&(0xFFFF))

أين value هو الخاص بك long long int, ، و x هي 0 أو 16 أو 32 أو 48 للسراويل الأربعة.

union LongLongIntToThreeUnsignedShorts {
   long long int long_long_int;
   unsigned short int short_ints[sizeof(long long int) / sizeof(short int)];
};

من المفترض أن يفعل ذلك ما تفكر فيه، دون الحاجة إلى العبث بتغيير البتات.

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