RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1151189
Accepted
Юрий
Юрий
Asked:2020-07-10 17:27:55 +0000 UTC2020-07-10 17:27:55 +0000 UTC 2020-07-10 17:27:55 +0000 UTC

将 N 个连续位分配为一个变量

  • 772

是否可以像使用 N 位的连续序列一样选择和处理纯 SI。N 大于 64。我设法分配的最大数量是 unsigned long long - 8 字节或 double - 10 字节。但这对我来说还不够。我需要共同存储约 150 位的数据,并使用按位运算来获取和放置值。如果您分配为指向某种类型的指针,那么您不能立即获得一整套位。在位域的帮助下,它也不起作用,因为您不能将它们顺序传递给函数。

c
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Harry
    2020-07-10T18:46:08Z2020-07-10T18:46:08Z

    你为什么不喜欢这样的东西?

    typedef struct { unsigned char b[32]; } bitfield;
    
    void zero(bitfield*b)
    {
        memset(b->b,0,sizeof(*b));
    }
    
    void set(bitfield*b, int i)
    {
        int idx = i/8;
        unsigned char mask = 1 << i%8;
        b->b[idx] |= mask;
    }
    
    int get(bitfield*b, int i)
    {
        int idx = i/8;
        return (b->b[idx] >> i%8)&0x01;
    }
    
    int main()
    {
        bitfield b;
        zero(&b);
        set(&b,15);
        set(&b,2);
        printf("%d - %d, %d - %d, %d - %d, %d - %d\n",
               2,  get(&b,2),  10,get(&b,10),
               12, get(&b,12), 15,get(&b,15));
    }
    

    编写其他函数不是问题...通过将常量 32 更改为所需的函数来缩放:)

    • 3
  2. Юрий
    2020-07-14T05:31:49Z2020-07-14T05:31:49Z

    顺便说一句,一切都是通过将字段“推”到 ull 来决定的。不是很通用,但很有效。unsigned long long *data 这是一个包含两个元素的数组

    #define OILPressusreMask 0xF000000000000000;
    #define OILTemperatureMask 0x0FE0000000000000;
    #define FuelTemperatureMask 0x001FC00000000000;
    #define FuelMassMask 0x00003FC000000000;
    #define XMask 0x0000003FFF000000;
    #define YMask 0x0000000000FFFC00;
    #define mmMask 0x001FC000000003F0;
    #define hhMask 0x001FC0000000000F;
    
    #define RPMMask 0xFFF0000000000000;
    #define ZMask 0x000FFFC000000000;
    #define VelocityMask 0x0000003FE0000000;
    #define HVelocityMask 0x000000001F000000;
    #define AzimuthMask  0x0000000000FF8000;
    #define HorizontMask 0x0000000000007FC0;
    #define ssMask 0x000000000000003F;
    
    
    struct U2
    {
        // First 64 bits (8 bytes)
        unsigned long long OilPressure:4;
        unsigned long long OilTemperature:7;
        unsigned long long FuelTemperature:7;
        unsigned long long FuelMass:8;
        unsigned long long X:14;
        unsigned long long Y:14;
        unsigned long long mm:6;
        unsigned long long hh:4;
        
        // Second 64 bits (8 bytes)
        unsigned long long RPM:12;
        unsigned long long Z:14;
        unsigned long long Velocity:9;
        unsigned long long HVelocity:5;
        unsigned long long Azimuth:9;
        unsigned long long Horizont: 9;
        unsigned long long ss:6;
    };
    
    unsigned short packTo2LongLongInt( unsigned long long *data, struct U2 *aircraft)
    {
        // Проверка на валидность данных. Коды ошибок подразумеваются......
        data[0] = 0; data[1] = 0;
        data[0] = aircraft->OilPressure;
        data[0] <<= 7;
        data[0] |= aircraft->OilTemperature;
        data[0] <<= 7;
        data[0] |= aircraft->FuelTemperature;
        data[0] <<= 8;
        data[0] |= aircraft->FuelMass;
        data[0] <<= 14;
        data[0] |= aircraft->X;
        data[0] <<= 14;
        data[0] |= aircraft->Y;
        data[0] <<= 6;
        data[0] |= aircraft->mm;
        data[0] <<= 4;
        data[0] |= aircraft->hh;
        
        #if defined(DEBUG)
            printf("Первые 64 бит упакованы успешно; ");
        #endif
        
        data[1] |= aircraft->RPM;
        data[1] <<= 14;
        data[1] |= aircraft->Z;
        data[1] <<= 9;
        data[1] |= aircraft->Velocity;
        data[1] <<= 5;
        data[1] |= aircraft->HVelocity;
        data[1] <<= 9;
        data[1] |= aircraft->Azimuth;
        data[1] <<= 9;
        data[1] |= aircraft->Horizont;
        data[1] <<= 6;
        data[1] |= aircraft->ss;
        
        #if defined(DEBUG)
            printf("Вторые 64 бит упакованы успешно; Упаковка завершена\n");
        #endif
    
        return 0;
    }
    
    unsigned short unpackFrom2LongLongInt( unsigned long long *data, struct U2 *aircraft)
    {
        unsigned long long tmp;
        unsigned char i = 60;
        
        tmp = data[0] & OILPressusreMask;
        tmp >>= i;
        aircraft->OilPressure = tmp;
        
        i-=7;
        tmp = data[0] & OILTemperatureMask;
        tmp >>= i;
        aircraft->OilTemperature = tmp;
        
        i -= 7;
        tmp = data[0] & FuelTemperatureMask;
        tmp >>= i;
        aircraft->FuelTemperature = tmp;
    
        i -= 8;
        tmp = data[0] & FuelMassMask;
        tmp >>= i;
        aircraft->FuelMass = tmp;
    
        i -= 14;
        tmp = data[0] & XMask;
        tmp >>= i;
        aircraft->X = tmp;
        
        i -= 14;
        tmp = data[0] & YMask;
        tmp >>= i;
        aircraft->Y = tmp;
    
        i -= 6;
        tmp = data[0] & mmMask;
        tmp >>= i;
        aircraft->mm = tmp;
    
        i -= 4;
        tmp = data[0] & hhMask;
        tmp >>= i;
        aircraft->hh = tmp;
    
        i = 64-12;
        tmp = data[1] & RPMMask;
        tmp >>= i;
        aircraft->RPM = tmp;
    
        i -= 14;
        tmp = data[1] & ZMask;
        tmp >>= i;
        aircraft->Z = tmp;
    
        i -= 9;
        tmp = data[1] & VelocityMask;
        tmp >>= i;
        aircraft->Velocity = tmp;
    
        i -= 5;
        tmp = data[1] & HVelocityMask;
        tmp >>= i;
        aircraft->HVelocity = tmp;
    
        i -= 9;
        tmp = data[1] & AzimuthMask;
        tmp >>= i;
        aircraft->Azimuth = tmp;
    
        i -= 9;
        tmp = data[1] & HorizontMask;
        tmp >>= i;
        aircraft->Horizont = tmp;
    
        i -= 6;
        tmp = data[1] & ssMask;
        tmp >>= i;
        aircraft->ss = tmp;
        
        #if defined(DEBUG)
            printf("Данные распакованы\n");
        #endif
    
        return 0;
    }
    
    • 0

相关问题

  • free 出于某种原因不会从内存中删除数组

  • 请帮助代码

  • 为什么 masm 对字符串或文本文字太长发誓,为什么在结构中设置 db 或 dw?

  • 如何将数字拆分为位并将其写入 C 中的数组?

  • 如何以给定的角度移动物体?

  • 解决“子集和问题”的时效算法

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5