[英]How to set bits in byte without loop
我真的很困惑,但似乎不能做簡單的任務:
我只需要設置字節數。
例如:
我需要5位設置。 所以我需要0xb00011111
。
沒有循環可以做到這一點嗎?
另外我也不想寫很多#defines
。
對於任何小於字中位數的整數n
,您需要的掩碼為:
const unsigned int mask = (1u << n) - 1;
不需要循環。
使用此功能的簡單功能:
unsigned int set_lsbs(unsigned int n)
{
return (1u << n) - 1;
}
第一個結果是:
0: 0x0
1: 0x1
2: 0x3
3: 0x7
4: 0xf
5: 0x1f
6: 0x3f
7: 0x7f
8: 0xff
9: 0x1ff
注意:語法0xb00011111
不是二進制文字,'b'只是被解釋為十六進制數字。
因此,可以生成掩碼以設置任何整數類型的最低有效5位:
mask = ~((~0u) << 5) ;
這將創建一個整數值,其中最低有效5位設置為1,所有高階位都不管整數類型設置為0。
特別針對8位類型:
uint8_t mask = ~((~0u) << 5) ;
解釋這是如何工作的(忽略大於8位的中間整數類型):
~0u
(一個人的贊美零)= 0x11111111
0x11100000
0x00011111
沒有循環可以做到這一點嗎?
是的 ,可以在沒有循環而不是random
位的情況下set
給定數量的n
位,可以設置n
個連續位。
在給定位置設置單個位
num = num | 1 << pos ;
要在給定的no中設置5
個連續位,您可以使用以下邏輯
num = num | 31 << pos;
這里
31 ==> 1x2^0 + 1x2^1 + .. => 31 is the sum of 5 ones(1 1111)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.