按位操作符"~"

本文探讨了JavaScript中位运算符的应用,特别是按位非运算符“~”结合数组indexOf方法的一种新颖用法,通过具体示例展示了其在代码简洁性和效率上的优势。

今天项目中看到一个js片段,引起了我的注意,之前也看过类似的,但是当时只是无意看到,大约知道是位运算符,因为之前没用上所以就没太留意,既然现在项目中有人用到了,就好好研究下。

var names = [];
var name = 'tom';
if (!~names.indexOf(name )){
	 console.log(name );
}

!~names.indexOf(name ) 是什么意思了?反正测试可以得出结果值有这个的规律 -(X+1),感觉还不是太明白。

于是,先查了一下文档:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

概述:

按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制数值。例如,十进制数9,用二进制表示则为1001。按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。

~ 即 (按位非)

aNOT a
01
10

对任一数值 x 进行按位非操作的结果为 -(x + 1)。例如,~5 结果为 -6。

var str = 'rawr';
var searchFor = 'a';

// 这是 if (-1*str.indexOf('a') <= 0) 条件判断的另一种方法
if (~str.indexOf(searchFor)) {
  // searchFor 包含在字符串中
} else {
  // searchFor 不包含在字符串中
}

// (~str.indexOf(searchFor))的返回值
// r == -1
// a == -2
// w == -3
例子
  • ~value的使用

判断数值中是否有某元素时,以前这样判断:

if(arr.indexOf(ele) > -1){...} //易读
现在可以这样判断,两者效率:

if(~arr.indexOf(ele)){...} //简洁
  • ~~value的使用

对于浮点数,~~value可以代替parseInt(value),而且前者效率更高些

parseInt(-2.99) //-2
~~(-2.99) //-2

位运算的效率会比运算符高。

单目操作符 `~` 是 C 语言中的一种按位操作符,其作用是对一个数的二进制表示按位取反。具体来说,操作数的每一个二进制位都会被反转,即 `0` 变为 `1`,`1` 变为 `0`。这种操作通常用于底层编程、数据压缩、加密算法等需要直接操作二进制位的场景。 ### 使用方法 该操作符直接作用于一个整型操作数,语法如下: ```c ~expression ``` 其中,`expression` 是一个整型表达式。例如,以下代码展示了如何使用 `~` 操作符对一个整数进行按位取反: ```c #include <stdio.h> int main() { int a = 8; printf("%d\n", ~a); // 输出结果为 -9 return 0; } ``` ### 按位取反的计算原理 在计算机中,整数是以补码形式存储的。对一个整数进行按位取反操作后,结果的值等于原数的补码表示按位反转后的值。以 `a = 8` 为例,其二进制补码表示为 `0000 0000 0000 1000`,按位取反后变为 `1111 1111 1111 0111`,该值在十进制中表示为 `-9` [^4]。 ### 应用场景 1. **位掩码操作**:`~` 操作符可以用于创建位掩码。例如,当需要将某些特定的位设置为 `0` 时,可以通过 `&` 操作符与 `~` 结合使用。 ```c int value = 0xFF; // 二进制为 1111 1111 int mask = ~(0x0F); // 创建掩码,将低4位设为0,结果为 1111 0000 value = value & mask; // 将 value 的低4位清零 ``` 2. **数据校验与变换**:在某些校验算法中,按位取反可以用于生成校验码或进行数据变换。 3. **硬件编程**:在嵌入式系统中,直接操作寄存器的某些位时,`~` 操作符非常有用。 ### 注意事项 - **数据类型影响**:由于 `~` 是按位操作符,因此操作数的数据类型会影响结果。例如,对 `char` 类型操作时,结果可能与对 `int` 类型操作时不同,因为 `char` 通常只有 8 位。 - **符号扩展问题**:当对较小的数据类型(如 `char`)执行按位取反后,将其转换为较大的类型(如 `int`)时,可能会发生符号扩展,影响最终结果。 ### 示例代码 以下代码展示了如何使用 `~` 操作符来统计一个整数的二进制中 `1` 的个数: ```c #include <stdio.h> int main() { int num = 0; int count = 0; scanf("%d", &num); for (int i = 0; i < 32; i++) { if (1 == ((num >> i) & 1)) { count++; } } printf("Number of 1s: %d\n", count); return 0; } ``` 通过这种方式,可以更深入地理解 `~` 操作符在实际编程中的应用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值