2017-05-28 140 views
-4

我有一個系統將音量(如在音頻放大器中)作爲16位無符號整數。我還有一個系統,該系統需要/提供了體積介於0和100將16位整數轉換爲0..100

0之間的整數爲0 100爲65536

什麼是轉換到/從數學?例如。在C#中。

+1

爲什麼不簡單地將結果除以655.35? (也是最大值將是65535,因爲65536將設置爲0溢出位。) – Lukasz032

+0

https://en.wikipedia.org/wiki/Cross-multiplication#Rule_of_Three –

+0

簡單的數學。 100%= 65536,1%='65,536'。 ('int result = 65536 * 1/100')你的問題是非常一般的imo。 – MrMAG

回答

-1

使用伐拉,這非常類似於C#(非常粗略的和簡單的方法):

public static int convert_from_unsigned_int_to_percentage (uint16 val) { 
    return (int) ((val/65535.0) * 100); 
} 

public static uint16 convert_from_percentage_to_unsigned_int (int val) { 
    return (uint16) ((val/100.0) * 65535); 
} 

int main (string[] args) { 
    print ("test1 65535 -> ? = %d\n", convert_from_unsigned_int_to_percentage (65535)); 
    print ("test1 32500 -> ? = %d\n", convert_from_unsigned_int_to_percentage (32500)); 
    print ("test1 100%% -> ? = %d\n", convert_from_percentage_to_unsigned_int (100)); 
    print ("test1 50%% -> ? = %d\n", convert_from_percentage_to_unsigned_int (50)); 

    return 0; 
} 

輸出:

./volume 
test1 65535 -> ? = 100 
test1 32500 -> ? = 49 
test1 100% -> ? = 65535 
test1 50% -> ? = 32767 
+0

已經2倒票,憤怒繼續...這個問題是非常具體的目標和答案語言的選擇,如果離開選擇誰來回答它。感謝支持者。在投票前仔細思考和理解,幸運的是你保持匿名,否則你的無知會公開。 –

+0

也許人們不喜歡Vala? – harold

+0

不應該是拒絕投票的理由。他們可以評論。如果需要,我會刪除它,但我們在這裏試圖幫助和所有這些投票憤怒已經讓我質疑,如果我應該繼續作出貢獻或只是進入潛伏模式... –

0

由655.36除以是一回事乘以100和然後除以65536,這可以純粹以整數算術完成:

int scaled = input * 100 >> 16; 

這是偏向下(因此不會導致100),因爲分割/右移中隱含的截斷。您可以通過添加0.5的偏見,使其圓均勻,

int temp = input * 100; 
temp += 0x8000; // 0x8000 = 0.5 in Q16 
int scaled = temp >> 16; 

這裏,0xfeb9和行動將導致100。如果這是不應該發生,因爲100是一個獨家束縛,你可以的當然乘以99代替。


其他的方式可以使用相同的原理來完成,

int scaled = ((input << 16) - 50)/100; 

這確保了100 - > 65535,65536也不是那麼它可能應該避免一個16位的數字。

一個在很大程度上類似的事情可以做短,但有額外的乘法,

int scaled = input * 65535/100; 

其結果有點不同,但分佈不作很大的差異。