2016-04-02 8 views
-1

Здравствуй»У меня есть проблема,Определить смещение с использованием только битовая

есть некоторые значения телеметрических упакован в словах (или двойных словах) и Bitmask для каждого телеметрического канала.

, например, у меня есть маска 0xF000 и значение слова 0x2499

после & операции я получил 0x2000, но реальное значение телеметрического упакованное в этом слове 0x2 (0x2000 >> 12). Как я могу определить это смещение, используя только маску и без циклов, как:

offset = 0; 
for (int i = 0;i<32 i++) 
{ 
    if ((mask>>i)&1) 
     { 
     offset = i 
     break; 
     } 
} 
+0

Как маска сам вычисляются и/или назначен? – Pemdas

+0

Маска задается в конфигурации параметра телеметрии – qmor

+0

У вас есть элемент управления для добавления параметров в эту конфигурацию? – Pemdas

ответ

1

Я думаю, вы можете использовать некоторые встроенные функции, чтобы получить первый ненулевой бит index.For пример GCC имеет int __builtin_ffs (int x)

— Built-in Function: int __builtin_ffs (int x) 
Returns one plus the index of the least significant 1-bit of x, or if x is zero, returns zero. 

Так что в вашем случае:

offset = __builtin_ffs(mask); 

MSDN имеет аналогичные встроенные функции _BitScanForward и _BitScanForward64

https://msdn.microsoft.com/en-us/library/wfd9z0bb.aspx

Все эти встроенные функции используют специальную инструкцию по сборке, которая выполняет требуемые вычисления на аппаратном уровне.

Смежные вопросы