簡體   English   中英

如何在沒有循環的情況下設置字節中的位

[英]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
  • 然后移動了5 = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM