c struct结构体分段

看代码中发现了一段一时间能理解(N年的老司机猜也能猜到了)但是又不太确定的代码:

union SID {
    SID(uint32_t sid) : sid_(sid) {}
    struct {
        uint32_t game_id_:16;   
        uint32_t role_idx_:16;   
    };
    uint32_t sid_;
};

明显这段代码的意思是game_id_和role_idx_各占16位,相当于平分了sid_的空间,至于game_id_和role_idx_谁占高位谁占地位,实验得出game_id_占低位(可能不同的平台因大小端字节序而不一致,没有详细研究)。

structu这种分段的写法以前读书的时候好像在哪里见过,工作的时候很少见到有人这么用,当然这与特定的业务逻辑场景有关。突然想着这种方式其实还很有用,例如tcp的协议头里面就有一些字段的大小只有几位,经常是连续的几个字段共用一个多个字节。这种情况下,用struct 分段的写法就非常有用,而且结构清晰明了。利用位移的方法就显得不那么直观,而且容易出错。

示例:

typedef struct _bits  {
    int a : 1;
    int b : 1;
    int c : 1;
    int d : 1;
    int e : 2;
}bits;

bits bit;
bit.a = 1;
bit.b = 1;
bit.d = 1;
bit.e = 2;

//bit = 43    0x101011

在最上面的代码中,结合联合体的使用,达到将一个内存数据拆分为高位和地位数据部分的目的。高位和地位的使用在标志量中应用很多,上面的方法不失为一种简单优雅的方法。

 

参考:

https://blog.csdn.net/iliuxi_/article/details/75040584

https://blog.csdn.net/u013427969/article/details/53015872

https://blog.csdn.net/jianxiong8814/article/details/1603948

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要输出分段线性插值的每段曲线函数公式,你可以使用以下C语言代码的示例: ```c #include <stdio.h> // 定义数据点结构体 typedef struct { double x; double y; } DataPoint; // 分段线性插值函数 void linearInterpolation(DataPoint *data, int size) { int i; // 对每个数据点进行插值 for (i = 0; i < size - 1; i++) { // 计算斜率 double slope = (data[i + 1].y - data[i].y) / (data[i + 1].x - data[i].x); // 输出每段曲线的函数公式 printf("对于 x 属于 [%f, %f],y = %f + (%f * (x - %f))\n", data[i].x, data[i + 1].x, data[i].y, slope, data[i].x); } } int main() { // 定义数据点数组 DataPoint data[] = {{1.0, 2.0}, {2.0, 4.0}, {3.0, 6.0}, {4.0, 8.0}, {5.0, 10.0}, {6.0, 12.0}, {7.0, 14.0}, {8.0, 16.0}, {9.0, 18.0}, {10.0, 20.0}, {11.0, 22.0}, {12.0, 24.0}, {13.0, 26.0}, {14.0, 28.0}}; // 进行分段线性插值并输出每段曲线函数公式 linearInterpolation(data, sizeof(data) / sizeof(data[0])); return 0; } ``` 在这个示例代码中,我们定义了一个包含14组数据点的数组。然后,我们在`linearInterpolation`函数中,对每个数据点进行插值。在每个区间内,我们计算斜率,并输出每段曲线的函数公式,其中包括 x 的范围和对应的斜率。最后,在`main`函数中,我们调用`linearInterpolation`函数来进行分段线性插值,并输出每段曲线的函数公式。 当你运行这个代码时,它会输出每段曲线的函数公式,例如: ``` 对于 x 属于 [1.000000, 2.000000],y = 2.000000 + (2.000000 * (x - 1.000000)) 对于 x 属于 [2.000000, 3.000000],y = 4.000000 + (2.000000 * (x - 2.000000)) 对于 x 属于 [3.000000, 4.000000],y = 6.000000 + (2.000000 * (x - 3.000000)) ... ``` 你可以根据需要修改数据点数组来进行测试。请注意,这段代码只是一个简单的示例,实际使用时可能需要考虑更多的异常情况和边界条件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值