按位非‘~’符号的使用

所谓的按位非就是在数字前加上~的符号

最简单的记忆方法是~(a) = -(a+1)

let a = 1;
let b = ~(a); // b=-2

let a = 2;
let b = ~(a); // b=-3

let a = -1;
let b = ~(a); // b=0

使用场景

在if判断的时候,if在0的情况下的转换为false的;

使用indexOf在找不到的情况下返回-1,通过按位非~即可转换成0;

indexOf有可能查找的数据下标为0,所以通过按位非~即可将0转换;

if (~data.indexOf('bug'))
<think>嗯,用户让我举例说明按位与、按位或、按位异或、按位非这些位运算符的运算过程。首先,我需要回忆一下这些运算符的基本定义和运算规则。按位与(&)是两个操作数的对应位都为1时,结果位才为1;按位或(|)是只要有一个位为1,结果位就为1;按位异或(^)是当两个对应位不同时结果为1,相同则为0;按位非~)则是单目运算符,对每一位取反,0变1,1变0。 接下来,我需要考虑用户可能的背景。他们可能刚开始学习编程或者计算机基础,想要通过具体的例子来理解这些位运算符的实际运算过程。因此,我需要用简单明了的例子,最好是使用较小的数字,比如8位二进制数,这样用户容易跟踪每一位的变化。 对于每个运算符,我应该分步骤解释,先给出十进制数字,转换成二进制,然后逐位进行运算,最后得到结果再转回十进制。这样用户可以看到整个过程,包括中间的二进制操作。 例如,按位与:比如5和3,二进制分别是0101和0011,按位与后得到0001,即1。按位或的话,5 | 3就是0111即7。异或的话,5 ^ 3是0110即6。按位非的话,比如~5,需要考虑二进制位数,假设是4位的话,~0101就是1010,即-6(补码表示)。不过要注意,实际中二进制位数可能更多,比如在8位系统中,~5是11111010,即-6。这可能会让用户困惑,因为涉及到补码的知识,可能需要稍微解释一下。 用户可能的疑问点在于按位非的结果为何是负数,以及如何处理不同位数的系统。这时候可能需要强调计算机中使用补码来表示负数,以及运算符对所有位进行操作,包括符号位。此外,用户可能分不清逻辑运算符和位运算符的区别,但这里的问题集中在位运算,所以暂时不需要展开逻辑运算。 另外,用户可能需要更多的例子来巩固理解,比如使用不同的数字,或者负数的情况。但考虑到问题的范围,可能先给出正数的例子,再简要提及负数的处理。或者可以举一个负数的例子,比如-5的按位非,但需要解释补码的转换过程,这可能会让问题复杂化,所以暂时先保持例子简单。 总结下来,我需要为每个运算符提供一个清晰的例子,分步骤展示二进制转换、按位运算、结果转换,并解释中间步骤。同时,注意指出可能的易错点,如补码在按位非中的影响,以及运算时的位数扩展问题。确保语言简洁,避免不必要的术语,让初学者也能理解。</think>好的!以下是 **按位运算符** 的详细解释和示例,通过具体的二进制计算过程来说明它们的运算规则。 --- ### **1. 按位与(&)** **规则**:两位**同时为1**时结果为1,否则为0。 **示例**:`5 & 3` - 5 的二进制:`0101` - 3 的二进制:`0011` - 逐位比较: ```text 0 1 0 1 & 0 0 1 1 ———————————— 0 0 0 1 ``` - **结果**:`0001`(十进制 **1**) --- ### **2. 按位或(|)** **规则**:两位中**至少有一个为1**时结果为1,否则为0。 **示例**:`5 | 3` - 5 的二进制:`0101` - 3 的二进制:`0011` - 逐位比较: ```text 0 1 0 1 | 0 0 1 1 ———————————— 0 1 1 1 ``` - **结果**:`0111`(十进制 **7**) --- ### **3. 按位异或(^)** **规则**:两位**不同时结果为1**,相同时为0。 **示例**:`5 ^ 3` - 5 的二进制:`0101` - 3 的二进制:`0011` - 逐位比较: ```text 0 1 0 1 ^ 0 0 1 1 ———————————— 0 1 1 0 ``` - **结果**:`0110`(十进制 **6**) --- ### **4. 按位非~)** **规则**:对每一位**取反**(0变1,1变0)。 **注意**:实际运算时,数值以补码形式存储,符号位也会被取反。 **示例**:`~5`(假设为4位二进制) - 5 的二进制:`0101` - 按位取反:`1010` - **补码解释**: - `1010` 是补码,转换为十进制: - 符号位为1,表示负数。 - 数值位取反加1:`010` → `101 + 1 = 110`(即6)。 - 结果:**-6** - **扩展说明**:实际编程中(如32位系统),`~5` 的结果为 `-6`,因为所有高位也会被取反。 --- ### **综合示例(8位二进制)** 假设 `A = 12`(`00001100`),`B = 10`(`00001010`): 1. **按位与**:`A & B = 00001000`(8) 2. **按位或**:`A | B = 00001110`(14) 3. **按位异或**:`A ^ B = 00000110`(6) 4. **按位非**:`~A = 11110011`(补码,对应十进制 **-13**) --- ### **关键总结** - **按位与(&)**:类似逻辑“与”,过滤特定位。 - **按位或(|)**:设置特定位为1。 - **按位异或(^)**:翻转特定位(如加密、交换变量值)。 - **按位非~)**:数值取反,注意补码规则。 通过具体二进制操作,可以直观理解位运算的底层逻辑!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别改我bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值