我有一個系統將音量(如在音頻放大器中)作爲16位無符號整數。我還有一個系統,該系統需要/提供了體積介於0和100將16位整數轉換爲0..100
0之間的整數爲0 100爲65536
什麼是轉換到/從數學?例如。在C#中。
我有一個系統將音量(如在音頻放大器中)作爲16位無符號整數。我還有一個系統,該系統需要/提供了體積介於0和100將16位整數轉換爲0..100
0之間的整數爲0 100爲65536
什麼是轉換到/從數學?例如。在C#中。
使用伐拉,這非常類似於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
已經2倒票,憤怒繼續...這個問題是非常具體的目標和答案語言的選擇,如果離開選擇誰來回答它。感謝支持者。在投票前仔細思考和理解,幸運的是你保持匿名,否則你的無知會公開。 –
也許人們不喜歡Vala? – harold
不應該是拒絕投票的理由。他們可以評論。如果需要,我會刪除它,但我們在這裏試圖幫助和所有這些投票憤怒已經讓我質疑,如果我應該繼續作出貢獻或只是進入潛伏模式... –
由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;
其結果有點不同,但分佈不作很大的差異。
爲什麼不簡單地將結果除以655.35? (也是最大值將是65535,因爲65536將設置爲0溢出位。) – Lukasz032
https://en.wikipedia.org/wiki/Cross-multiplication#Rule_of_Three –
簡單的數學。 100%= 65536,1%='65,536'。 ('int result = 65536 * 1/100')你的問題是非常一般的imo。 – MrMAG