WEB前端

当前位置:首页 > 技术世界 > WEB前端

常用位运算整理

位运算优先级

( + - ) > ( << >> ) > ( ~ & ^ | )

右边第k位系列


var x = 18; // 10010// 取右边第k位// x >> (k - 1) & 1console.log(x >> (2 - 1) & 1); // 1// 把右边第k位变为0// x & ~(1 << (k - 1))console.log(x & ~(1 << (2 - 1))); // 16// 把右边第k位变为1// x | (1 << (k - 1))console.log(x | (1 << (1 - 1))); // 19// 把右边第k位取反// x ^ (1 << (k - 1))console.log(x ^ (1 << (3 - 1))); // 22

末k位系列


var x = 18; // 10010// 求末k位// x & (1 << k) - 1console.log(x & (1 << 3) - 1); // 2// 把末k位变0// x & ~((1 << k) - 1)console.log(x & ~((1 << 3) - 1)); // 16// 把末k位变1// x | (1 << k) - 1console.log(x | (1 << 4) - 1); // 31// // 把末k位取反// x ^ (1 << k) - 1console.log(x ^ (1 << 4) - 1); // 29

右边连续0或者1系列


var x = 19; // 10011// 把右边连续的1变为0// x & (x + 1)console.log(x & (x + 1)); // 16// 取右边连续的1// (x ^ (x + 1)) >> 1console.log((x ^ (x + 1)) >> 1); // 3var y = 16; // 10000// 把右边连续的0变为1// x | (x - 1)console.log(y | (y - 1)); // 31// 去除右边连续的0var a = 40; // 101000a = a >> (Math.log(a & (-a)) / Math.log(2));console.log(a); // 5 (101)

右边第一个0或者1系列


var x = 18; // 10010// 把右边第一个1变为0// x & (x - 1)console.log(x & (x - 1)); // 16// 取出右边第一个1// x & (-x)console.log(x & (-x));  // 2// 把右边第一个0变为1// x | (x + 1)console.log(x | (x + 1)); // 19

简单应用


// 乘2的幂 除2的幂console.log(63 >> 1); // 31console.log(1 << 4); // 16// 判断奇偶var a = 10;console.log(a & 1); // 0偶 1奇// 小数向下取整var b = 1.25  , c = -1.25;console.log(b | 0); // 1console.log(~~b); // 1console.log(b << 0); // 1console.log(b >> 0); // 1console.log(c | 0); // -1console.log(~~c); // -1console.log(c << 0); // -1console.log(c >> 0); // -1// 交换数字var a = 10, b = 20;a = a ^ b;b = a ^ b;a = a ^ b;console.log(a, b); // 20 10// 正负转换var a = 10, b = -5;console.log(~a + 1); // -10console.log(~b + 1); // 5console.log((a ^ -1) + 1); // -10console.log((b ^ -1) + 1); // -5// 模2的幂var a = 153;console.log(a % 16); // 9console.log(a & (1 << 4) - 1); // 9// 判断两数符号是否相同 (注意有0的情况)var sign = a * b > 0;var sign = (a ^ b) > 0;// 取绝对值// 写法1i = x < 0 ? -x : x;// 写法2i = (x ^ (x >> 31)) - (x >> 31);// 写法3i= x ^ ( ~(x >> 31) + 1) + (x >> 31);// 判断是不是2的幂var isPowerOfTwo = function(n) {  return (!(n & (n - 1)) && n > 0);};

常用的二进制数


0xAAAAAAAA 101010101010101010101010101010100x55555555 010101010101010101010101010101010xCCCCCCCC 110011001100110011001100110011000x33333333 001100110011001100110011001100110xF0F0F0F0 111100001111000011110000111100000x0F0F0F0F 000011110000111100001111000011110xFF00FF00 111111110000000011111111000000000x00FF00FF 000000001111111100000000111111110xFFFF0000 111111111111111100000000000000000x0000FFFF 00000000000000001111111111111111

枚举集合子集


枚举出一个集合的子集。设原集合为mask,则下面的代码就可以列出它的所有子集:

var mask = 5; // 1101for (i = mask; i; i = (i - 1) & mask) {  console.log(i); // 5 4 1}

转载说明:欢迎转载本站所有文章,如需转载请注明来源于《绝客部落》。

本文链接:https://juehackr.net/qianduan/70.html

相关内容

文章评论

表情

共 0 条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~