跳到主要内容

有符号按位右移

2024年03月11日
柏拉文
越努力,越幸运

一、认识


x >> y 右移操作,将 x 在二进制下的每一位向右移动 y 位,最左边用 0 填充。

二、规则


  • 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
  • 按位右移时,任何数字 x 的结果都是x*2^-y

三、语法


四、场景


4.1 取整

value >> 0转为 Number 类型并向下取整

结果: value >> 0Number(value) 结果类似,只不过将结果为NaN的转为0而已, 并将数字向下取整

  • 对于Number: 返回自己

    const value = 9;

    console.log(+value); // 9
    console.log(Math.floor(+value)); //9
    console.log(value >> 0); // 9
    console.log(value >>> 0); // 9
    console.log(Number(value)); // 9
    console.log(Math.floor(Number(value))); //9

    const value = 3.6;

    console.log(+value); // 3.6
    console.log(Math.floor(+value)); //3
    console.log(value >> 0); // 3
    console.log(value >>> 0); // 3
    console.log(Number(value)); // 3.6
    console.log(Math.floor(Number(value))); //3
  • 对于String: 如果字符串都为有效数字字符串,那么返回数字; 只要有一个不为数字字符,返回0

    const value = "32a";

    console.log(+value); // NaN
    console.log(value >> 0); // 0
    console.log(value >>> 0); // 0
    console.log(Number(value)); // NaN

    const value = "32";

    console.log(+value); // 32
    console.log(value >> 0); // 32
    console.log(value >>> 0); // 32
    console.log(Number(value)); // 32

    const value = " 32 ";

    console.log(+value); // 32
    console.log(value >> 0); // 32
    console.log(value >>> 0); // 32
    console.log(Number(value)); // 32
  • 对于BigInt类型: 抛出 TypeError,以防止意外的强制隐式转换损失精度。

  • 对于Symbol类型: 抛出 TypeError

  • 对于Object类型: 返回0

    const value = {};

    console.log(+value); // NaN
    console.log(value >> 0); // 0
    console.log(value >>> 0); // 0
    console.log(Number(value)); // NaN
  • 对于Array类型: 返回0

    const value = [];

    console.log(+value); // 0
    console.log(value >> 0); // 0
    console.log(value >>> 0); // 0
    console.log(Number(value)); // 0

    const value = [1,2];

    console.log(+value); // NaN
    console.log(value >> 0); // 0
    console.log(value >>> 0); // 0
    console.log(Number(value)); // NaN

    const value = [8];

    console.log(+value); // 8
    console.log(value >> 0); // 8
    console.log(value >>> 0); // 8
    console.log(Number(value)); // 8

4.2 除 2 取整

value >> 1转为 Number 类型除以2并向下取整

结果: 结果同>>value>>> valueNumber(value) 结果类似,只不过将结果为NaN的转为0而已, 并将数字除以2且向下取整

  • 对于Number: 返回自己

    const value = 9;

    console.log(+value); // 9
    console.log(Math.floor(+value / 2)); // 4
    console.log(value >> 1); // 4
    console.log(value >>> 1); // 4
    console.log(Number(value)); // 9
    console.log(Math.floor(Number(value) / 2)); // 4
  • 对于String: 如果字符串都为有效数字字符串,那么返回数字; 只要有一个不为数字字符,返回0

    const value = "32a";

    console.log(+value); // NaN
    console.log(Math.floor(+value / 2)); // NaN
    console.log(value >> 1); // 0
    console.log(value >>> 1); // 0
    console.log(Number(value)); // NaN
    console.log(Math.floor(Number(value) / 2)); // NaN

    const value = "32";

    console.log(+value); // 32
    console.log(Math.floor(+value / 2)); // 16
    console.log(value >> 1); // 16
    console.log(value >>> 1); // 16
    console.log(Number(value)); // 32
    console.log(Math.floor(Number(value) / 2)); // 16

    const value = " 32 ";

    console.log(+value); // 32
    console.log(Math.floor(+value / 2)); // 16
    console.log(value >> 1); // 16
    console.log(value >>> 1); // 16
    console.log(Number(value)); // 32
    console.log(Math.floor(Number(value) / 2)); // 16
  • 对于BigInt类型: 抛出 TypeError,以防止意外的强制隐式转换损失精度。

  • 对于Symbol类型: 抛出 TypeError

  • 对于Object类型: 返回0

    const value = {};

    console.log(+value); // NaN
    console.log(Math.floor(+value / 2)); // NaN
    console.log(value >> 1); // 0
    console.log(value >>> 1); // 0
    console.log(Number(value)); // NaN
    console.log(Math.floor(Number(value) / 2)); // NaN
  • 对于Array类型: 返回0

    const value = [];

    console.log(+value); // 0
    console.log(Math.floor(+value / 2)); // 0
    console.log(value >> 1); // 0
    console.log(value >>> 1); // 0
    console.log(Number(value)); // 0
    console.log(Math.floor(Number(value) / 2)); // 0

    const value = [1,2];

    console.log(+value); // NaN
    console.log(Math.floor(+value / 2)); // NaN
    console.log(value >> 1); // 0
    console.log(value >>> 1); // 0
    console.log(Number(value)); // NaN
    console.log(Math.floor(Number(value) / 2)); // NaN

    const value = [8];

    console.log(+value); // 8
    console.log(Math.floor(+value / 2)); // 4
    console.log(value >> 1); // 4
    console.log(value >>> 1); // 4
    console.log(Number(value)); // 8
    console.log(Math.floor(Number(value) / 2)); // 4