当年书没好好读,在做这行十几年之后的今天才有所了解这个位移操作。觉得很有意思所摘录下来,当笔记用。
参考网址如下:
http://www.w3school.com.cn/js/pro_js_operators_bitwise.asp
https://whis.wang/index.php/javascript/an-operator-use-in-js.html
摘录内容:
4.使用&, >>, |来完成rgb值和16进制颜色值之间的转换
/**
* 16进制颜色值转RGB
* @param {String} hex 16进制颜色字符串
* @return {String} RGB颜色字符串
*/
function hexToRGB(hex) {
var hexx = hex.replace('#', '0x')
var r = hexx >> 16
var g = hexx >> 8 & 0xff
var b = hexx & 0xff
return `rgb(${r}, ${g}, ${b})`
}
/**
* RGB颜色转16进制颜色
* @param {String} rgb RGB进制颜色字符串
* @return {String} 16进制颜色字符串
*/
function RGBToHex(rgb) {
var rgbArr = rgb.split(/[^\d]+/)
var color = rgbArr[1]<<16 | rgbArr[2]<<8 | rgbArr[3]
return '#'+ color.toString(16)
}
// -------------------------------------------------
hexToRGB('#ffffff') // 'rgb(255,255,255)'
RGBToHex('rgb(255,255,255)') // '#ffffff'
================================================================================================
总的来说,位移的应用多数是用在将大的数据分块储存在 byte[] 里(一个byte存 8 位,即 256;所以无论左移还是右移时都是 8 的倍数)。
右移是将数据分块,左移是将数据合并还原。数据分块和合并的操作就是利用 ^、& 和 | 操作符。
例如:#aabbcc 向右移 8 位则变为 #aabb,再右移 8 位则变为 #aa;#aa左移 16 位则为 #aa0000,#bb左移 8 位#bb00, 位移后再与 #cc 用 | 做合并就可得出 #aabbcc
如果我要取出 bb,第一步,#aabbcc 右移 16 位,再左移 8 位,得 #aa00;第二步,#aabbcc 右移 8 位,得 #aabb,然后 #aa00 ^ #aabb,得 #bb
以上的逻辑相信比看代码好看多了。:)