gpt4 book ai didi

c# - 为什么这个函数用按位运算符这样翻译?

转载 作者:行者123 更新时间:2023-11-30 13:46:56 25 4
gpt4 key购买 nike

我一直在为设备编写一个控制类,直到我需要将 ARGB 颜色转换成它的格式。起初,我写了这个函数(有效):

private static int convertFormat(System.Drawing.Color c)
{
String all;

int a = (int)((float)c.A / 31.875);

if (a == 0)
a = 1;

all = a.ToString() + c.B.ToString("X").PadLeft(2, '0') + c.G.ToString("X").PadLeft(2, '0') + c.R.ToString("X").PadLeft(2, '0');

int num = int.Parse(all, System.Globalization.NumberStyles.AllowHexSpecifier);

return num;
}

但是它太丑了我想写一个更优雅的解决方案。所以我做了一些以获得正确的值,尝试了 0 到 50 之间的所有组合。它奏效了,我最终得到了这个:

private static int convertFormatShifting(System.Drawing.Color c)
{
int alpha = (int)Math.Round((float)c.A / 31.875);

int a = Math.Max(alpha,1);

return (a << 24) | (c.B << 48) | (c.G << 40) | (c.R << 32);
}

有效!

但现在,我希望有人能向我解释为什么这些是正确的变化值。

最佳答案

最容易混淆的移位值应该如下所示:

return (a << 24) | (c.B << 16) | (c.G << 8) | (c.R << 0);
// Of course there's no need to shift by zero ^^^^^^^^

您的值起作用的原因是移位运算符 mod 位于右侧,左侧是操作数的位长度。换句话说,以下所有移位都是等价的:

c.G << 8
c.G << 40
c.G << 72
c.G << 104
...

关于c# - 为什么这个函数用按位运算符这样翻译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19319544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com