有符号按位右移
2024年03月11日
一、认识
x >> y
右移操作,将 x 在二进制下的每一位向右移动 y 位,最左边用 0 填充。
二、规则
- 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
- 按位右移时,任何数字 x 的结果都是
x*2^-y
三、语法
四、场景
4.1 取整
value >> 0
转为 Number
类型并向下取整
结果: value >> 0
和Number(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
、>>> value
和Number(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