位运算是因rgb三通道共24位,可直接按位组合并分组转十六进制,避免隐式转换开销及前导零丢失;如r=204,g=51,b=102,先r

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:
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
<p>这里 <code>padStart(6, '0')</code> 替代了老式 <code>("000000" + hex).slice(-6)</code>,更清晰;<code>& 0xffffff</code> 可省略,因为 <code>r,g,b</code> 已限定在 8 位内,或运算结果天然不超 24 位。</p>
<h3>注意符号位陷阱(负数情况)</h3>
<p>JavaScript 的 <code>>></code>(有符号右移)会扩展符号位,但 RGB 值非负,所以应避免用它。若误写 <code>r >> 0</code> 对正数无害,但 <code>-1 >> 0</code> 仍是 <code>-1</code>,而 <code>-1 >>> 0</code>(无符号右移)才得 <code>4294967295</code>。因此对输入校验推荐用 <code>Math.floor</code> + <code>Math.max/min</code>,而非依赖位运算做截断。</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











