如何在 C 中仅设置字节的某些位而不影响其余位? | 珊瑚贝

How do you set only certain bits of a byte in C without affecting the rest?


假设我有一个像 1010XXXX 这样的字节,其中 X 值可以是任何值。我想将低四位设置为特定模式,比如 1100,而高四位不受影响。我如何在 C 语言中以最快的速度做到这一点?


一般来说:

1
value = (value & ~mask) | (newvalue & mask);

mask 是一个值,所有要更改的位(并且只有它们)设置为 1 – 在您的情况下它将是 0xf 。 newvalue 是一个包含这些位的新状态的值 – 所有其他位基本上都被忽略了。

这适用于支持位运算符的所有类型。

  • 你能举一个具体的例子吗?假设我有:n = 1024。我想将位置 3 到 7(包括,从 0 和最低有效位开始)的位更改为 k = 19。结果应该是:1176。我该如何实现呢?谢谢你。
  • 刚刚自己解决了这个问题,我想出了以下宏来概括这个问题。 (不知道为什么代码格式化不起作用,抱歉)“` #define MASK(L,P) (~(0xffffffff << (L)) << (P)) #define GET_VAL(BF,L,P) (( (高炉)


您可以通过按位与设置将所有这些位设置为 0,其中 4 位设置为 0,所有其他位设置为 1(这是设置为 1 的 4 位的补码)。然后,您可以像往常一样按位或按位进行操作。

1
2
3
 val &= ~0xf; // Clear lower 4 bits. Note: ~0xf == 0xfffffff0
 val |= lower4Bits & 0xf; // Worth anding with the 4 bits set to 1 to make sure no
                          // other bits are set.
  • 为什么?0xf等于0x0000000f(四个字节),为什么不是3个字节或5个字节?编译器是否根据要进行 ANDED 的 sizeof val 决定长度 4?
  • @doc_id:我假设 val 是一个 32 位整数。它可能是 16 位或 64 位,但不太可能是 24 或 40 位,因为它们不是标准整数类型……


n


使用按位运算符或 |当您想将字节的位从 0 更改为 1.

使用位运算符和


来源:https://www.codenong.com/4439078/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9686.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?