位运算是因RGB三通道共24位,可直接按位组合并分组转十六进制,避免隐式转换开销及前导零丢失;如r=204,g=51,b=102,先r<<16|g<<8|b得0xcc3366,再转字符串。

JavaScript 中用位运算处理 RGB 转 Hex,核心是把三个 0–255 的十进制数压缩成一个 6 位十六进制字符串,位运算是高效、无字符串拼接的底层实现方式。
为什么用位运算?
RGB 各通道是 8 位无符号整数(0–255),合起来刚好 24 位。Hex 颜色本质就是这 24 位按每 4 位一组,转成 6 个十六进制字符。位运算直接操作二进制,避免 parseInt、toString(16) 的隐式转换开销,也天然规避前导零丢失问题(比如 12.toString(16) 得 "c",不是 "0c")。
关键位运算步骤拆解
假设 r = 204, g = 51, b = 102(即 #cc3366):
-
左移归位:把 R 放高 8 位(
r ),G 放中间 8 位(<code>g ),B 留低 8 位(<code>b) -
合并为 24 位整数:用按位或
|拼接:(r → 得到 <code>13775718(十进制),二进制是1101001000001100110110 -
补零并转 Hex:用
(num).toString(16)会得"cc3366",但若某通道为 0(如r=0, g=0, b=0),直接 toString 不会丢位;不过更稳妥的是用位掩码确保只取低 24 位:((r ,再转 16 进制
带校验和补零的实用写法
实际中需约束输入范围,并保证输出始终为 6 位小写 Hex:
立即学习“Java免费学习笔记(深入)”;
function rgbToHex(r, g, b) {
// 截断并取整:确保 0–255
r = Math.max(0, Math.min(255, Math.floor(r)));
g = Math.max(0, Math.min(255, Math.floor(g)));
b = Math.max(0, Math.min(255, Math.floor(b)));
// 位运算合成 + 掩码 + 补零
const hex = ((r << 16) | (g << 8) | b).toString(16);
return '#' + hex.padStart(6, '0');
}
这里 padStart(6, '0') 替代了老式 ("000000" + hex).slice(-6),更清晰;& 0xffffff 可省略,因为 r,g,b 已限定在 8 位内,或运算结果天然不超 24 位。
注意符号位陷阱(负数情况)
JavaScript 的 >>(有符号右移)会扩展符号位,但 RGB 值非负,所以应避免用它。若误写 r >> 0 对正数无害,但 -1 >> 0 仍是 -1,而 -1 >>> 0(无符号右移)才得 4294967295。因此对输入校验推荐用 Math.floor + Math.max/min,而非依赖位运算做截断。


















