代码改变世界

认识位移操作符

2018-11-22 12:57  Koy  阅读(728)  评论(0编辑  收藏  举报

当年书没好好读,在做这行十几年之后的今天才有所了解这个位移操作。觉得很有意思所摘录下来,当笔记用。

参考网址如下:

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

以上的逻辑相信比看代码好看多了。:)