我有一个系统将音量(如在音频放大器中)作为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