2017-05-28 143 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; 

其结果有点不同,但分布不作很大的差异。