簡體   English   中英

該代碼如何獲得最低位位置?

[英]How does this code for getting the lowest bit position work?

unsigned GetLowestBitPos(unsigned value)
{
   double d = value ^ (value - !!value); 
   return (((int*)&d)[1]>>20)-1023; // This is what I really need help understanding. 
}

在我看來,代碼正在將double轉換為指向整數的指針。 我不確定[1]用於什么。 然后看起來我們在向右移20位

我希望在此代碼上有任何幫助。 自從我用C ++編程以來已經有一段時間了,我正在嘗試為可編程邏輯控制器(PLC)編寫邏輯,以便在可能的情況下做同樣的事情。

謝謝你的幫助

讓我們一次邁出這一步。 第一:

double d = value ^ (value - !!value);

如果value = 0 ,則其取值為0 ^(0-0),因此d為0。如果value != 0 ,則其取值為^(value-1)。 這具有將值的最低一位和最低零位設置為1,並將所有其他位設置為零的效果。 例如:

value = 010100100
d     = 000000111

發生這種情況的原因是(value - 1)value相同,除了零位的最低字符串變為1,而下一位由於攜帶而變為零。

value     = 010100100
value - 1 = 010100011
XOR value = 000000111

在任何情況下, d都將為此值的浮點值加載。 下一行:

return (((int*)&d)[1]>>20)-1023; 

這將提取浮點指數,並增加偏差。 請注意,這是假設使用小端格式的,例如x86; 在大型字節序系統上,您需要使用[0] 它還對intdoubles的大小進行了假設-特別是,它假設32位int和64位IEEE浮點數表示double。

此處的關鍵是未歸一化的IEEE浮點值(並且雙1.xxxxxxxx * 2^(e-1023)的32位int將始終被非1.xxxxxxxx * 2^(e-1023)一化)最終以類似於1.xxxxxxxx * 2^(e-1023)的表示形式表示,其中xxxxxxxx是小數部分, e是指數。 由於您已將感興趣的位排列為最高階的位,因此指數隨所需的值而增加。

就是說,您可能無法在PLC上使用它-盡管這是一個非常聰明的技巧,但如果您擁有硬件FPU,它甚至僅在遠程上有效。 即使在x86系統上,也有更快的內置整數運算 這樣的SO問題還有許多其他的技術; 您可能可以在那里找到更快的產品。 您的PLC也可能具有內置操作,也可以在一條指令中執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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