эффективный и читаемый способ выделить группу битов - PullRequest
0 голосов
/ 16 января 2012

Учитывая смещение OFF и длину LEN, выделите группу битов и сдвиньте ее вправо. (Использование: int, содержащее несколько целых чисел меньшего диапазона с заданными смещениями и длинами). Например, используя смещение 4 и длину 4,

  a = 110101011000
      ----^^^^---- this is the group 
      000000000101
              ^^^^ isolated and right-shifted here

Я сейчас использую

(a>>OFF)&((1<<(LEN+1))-1)

дает для примера выше

a                         110101011000
a>>OFF                    000011010101
1<<(LEN+1)                000000010000
1<<(LEN+1)-1              000000001111
(a>>OFF)&((1<<(LEN+1))-1) 000000000101

Есть ли более читаемый / эффективный способ?

Ответы [ 2 ]

0 голосов
/ 26 марта 2013

110101011000

Сдвиг влево 010110000000

Сдвиг вправо 000000000101

Это более читабельно ..!

0 голосов
/ 12 августа 2012

В этом случае нет единственного правильного ответа. То, что вы сделали, хорошо - это правильно, и с некоторой документацией это также довольно ясно.

Если вам нужны другие способы, вы можете: попытаться сместить a влево, а затем еще раз вправо (при условии, что a не подписано - в противном случае произнесите его первым); или вы можете сначала создать маску (в вашем случае: 000011110000), поразрядно-и, и только потом сдвиг. Однако они не обязательно будут красивее, чем у вас уже есть.

...