颜色代码解析

颜色代码的格式通常是 #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

位移操作的特性

  1. 位移位数限制:位移位数应当小于操作数的位数。对于32位整数,位移位数应小于32;对于64位整数,应小于64。如果超过,实际位移位数是位数 % 类型位数

  2. 性能:位移操作通常比乘除法运算更快,因为它们是处理器直接支持的底层操作。

  3. 溢出:左移可能导致溢出,特别是当移动符号位时。

常见用途

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;

注意事项

  1. 符号扩展:对于有符号类型的右移操作,要注意符号位的扩展可能不是你想要的行为。

  2. 类型转换:位移操作的结果类型与左操作数相同。如果需要对字节进行位移,可能需要先转换为更大的类型。

  3. 可读性:虽然位移操作可以提高性能,但可能降低代码可读性,应适当添加注释。

  4. 边界情况:位移位数不能为负数,否则会抛出异常。

位移操作是C#中强大的低级操作工具,合理使用可以在某些场景下显著提高性能,但也需要谨慎使用以避免难以察觉的错误。

posted @ 2025-01-16 22:34  JohnYang819  阅读(551)  评论(0)    收藏  举报