颜色代码解析
颜色代码的格式通常是 #AARRGGBB 或 #RRGGBB:
AA:Alpha 通道(透明度),00 表示完全透明,FF 表示完全不透明。
RR:红色通道,00 表示无红色,FF 表示红色最大值。
GG:绿色通道,00 表示无绿色,FF 表示绿色最大值。
BB:蓝色通道,00 表示无蓝色,FF 表示蓝色最大值。
例如:
00FFFFFF:
AA = 00:完全透明。
RR = FF:红色最大值。
GG = FF:绿色最大值。
BB = FF:蓝色最大值。
结果:完全透明的白色。
C#手动转:
string color = "#abcdef";
int argb = Convert.ToInt32(color.Substring(1),16);
byte alpha = (byte)(argb>>24 & 0xFF);//0xFF代表8位全部是1的数字,即255,向右移动24位,
//即3个字节(对于0xNN,N就是4位),那么形成的新的byte的最低位就是R分量了,
//与0xFF进行&操作,就可以取出alpha分量
//也就是:左右移动是所有位向左右移动,空出来的用0补齐
byte red = (byte)((argb >> 16) & 0xFF); // 提取红色通道
byte green = (byte)((argb >> 8) & 0xFF); // 提取绿色通道
byte blue = (byte)(argb & 0xFF); // 提取蓝色通道
float redF = red / 255f, greenF = green / 255f, blueF = blue / 255f;
Console.WriteLine($"redF:{redF },greenF:{greenF},blueF:{blueF}");
通过https://www.colorhexa.com/abcdef的查询:
可以发现,结果一致!
C# 中的位移操作符详解
位移操作符是C#中用于对整数类型进行二进制位移动的操作符,主要包括左移操作符(<<
)和右移操作符(>>
)。这些操作符在底层编程、性能优化和某些特定算法中非常有用。
基本位移操作符
1. 左移操作符 (<<
)
左移操作符将操作数的所有位向左移动指定的位数,右侧空出的位用0填充。
int a = 5; // 二进制: 00000101
int result = a << 2; // 二进制: 00010100 (即十进制20)
Console.WriteLine(result); // 输出: 20
2. 右移操作符 (>>
)
右移操作符的行为取决于操作数的类型:
- 对于有符号整数(如
int
,long
等):执行算术右移,左侧空出的位用符号位填充(正数补0,负数补1) - 对于无符号整数(如
uint
,ulong
等):执行逻辑右移,左侧空出的位总是用0填充
int b = 20; // 二进制: 00010100
int result1 = b >> 2; // 二进制: 00000101 (即十进制5)
Console.WriteLine(result1); // 输出: 5
int c = -20; // 二进制: 11101100 (补码表示)
int result2 = c >> 2; // 二进制: 11111011 (即十进制-5)
Console.WriteLine(result2); // 输出: -5
uint d = 20; // 二进制: 00010100
uint result3 = d >> 2; // 二进制: 00000101 (即十进制5)
Console.WriteLine(result3); // 输出: 5
位移操作的特性
-
位移位数限制:位移位数应当小于操作数的位数。对于32位整数,位移位数应小于32;对于64位整数,应小于64。如果超过,实际位移位数是
位数 % 类型位数
。 -
性能:位移操作通常比乘除法运算更快,因为它们是处理器直接支持的底层操作。
-
溢出:左移可能导致溢出,特别是当移动符号位时。
常见用途
1. 快速乘除2的幂次方
int x = 10;
int doubled = x << 1; // 相当于 x * 2
int halved = x >> 1; // 相当于 x / 2
int times8 = x << 3; // 相当于 x * 8
2. 位掩码操作
// 检查第3位是否设置
int value = 0b1010;
bool isSet = (value & (1 << 2)) != 0; // 检查第3位(从0开始)
// 设置第4位
value |= (1 << 3); // 变为 0b1010 | 0b1000 = 0b1010
3. 颜色处理
// 从32位颜色值中提取RGB分量
uint color = 0xFFAABBCC;
byte a = (byte)(color >> 24);
byte r = (byte)(color >> 16);
byte g = (byte)(color >> 8);
byte b = (byte)color;
4. 高效存储多个布尔值
// 使用一个int存储多个布尔值
int flags = 0;
flags |= 1 << 0; // 设置第1个标志
flags |= 1 << 1; // 设置第2个标志
// 检查标志
bool firstFlagSet = (flags & (1 << 0)) != 0;
注意事项
-
符号扩展:对于有符号类型的右移操作,要注意符号位的扩展可能不是你想要的行为。
-
类型转换:位移操作的结果类型与左操作数相同。如果需要对字节进行位移,可能需要先转换为更大的类型。
-
可读性:虽然位移操作可以提高性能,但可能降低代码可读性,应适当添加注释。
-
边界情况:位移位数不能为负数,否则会抛出异常。
位移操作是C#中强大的低级操作工具,合理使用可以在某些场景下显著提高性能,但也需要谨慎使用以避免难以察觉的错误。
#####
愿你一寸一寸地攻城略地,一点一点地焕然一新
#####