Day05--位运算符
位运算符
//位运算符:& ,|,^,<<,>>
//位运算,与二进制有关
A=0011 1100
B=0000 1101
A&B=0000 1100 //按位与 (&),对于两个操作数的每一个对应位,如果两个位都是1,则结果位为1,否则为0
A|B=0011 1101 //按位或 (|),对于两个操作数的每一个对应位,如果两个位中有任意一个为1,则结果位为1,否则为0。
A^B=0011 0001 //按位异或 (^),对于两个操作数的每一个对应位,如果两个位不相同,则结果位为1,否则为0。
~B=1111 0010 //按位非 (~),单一操作数:对操作数的每一位进行取反,即0变为1,1变为0。
有趣的面试题:
如何最快的计算2*8的结果?
System.out.println(2<<3);
// <<:*2;
// >>:/2
//2<<3:2*(2^3)
/*
式子解析
0000 0000:0
0000 0001:1
0000 0010:2 -------------
0000 0011:3
0000 0100:4 --------------
0000 0101:5
0000 0110:6---------------
0000 0111:7
0000 1000:8--------------
......
0001 0000:16------------
二进制的1每向左移动一位,就相当于十进制的数乘二
2<<3:二进制的1向左移动3位,相当于十进制的数连乘3个2,也就是2^3
由于位运算符直接对二进制进行运算,所以运算最快
题目:
-
位运算符
-
计算
7 & 4
的值。 -
计算
9 | 3
的值。 -
计算
~10
的值。 -
计算
12 ^ 5
的值。
-
解析:
位运算符是对二进制位进行操作的运算符,主要包括按位与(&)、按位或(|)、按位取反(~)、按位异或(^)等。以下是相关计算知识:
按位与(&)
运算规则:只有当两个对应位都为 1 时,结果位才为 1,否则为 0。
计算示例:计算7 & 4,7的二进制是111,4的二进制是100,按位与运算为111 & 100 = 100,即十进制的4。
按位或(|)
运算规则:只要两个对应位中有一个为 1,结果位就为 1,只有当两个对应位都为 0 时,结果位才为 0。
计算示例:计算9 | 3,9的二进制是1001,3的二进制是0011,按位或运算为1001 | 0011 = 1011,即十进制的11。
在编程中,计算按位非运算符(~
)的题目主要涉及到理解二进制数、补码表示法以及如何处理负数。下面我将详细解释这个过程。
按位非运算符
按位非运算符 ~
是一元运算符,它作用于一个操作数上,并且会逐位翻转该操作数的二进制表示形式中的每一位。也就是说,它会把所有的0变成1,所有的1变成0。
二进制和补码
计算机内部使用二进制来表示数字,并且通常采用补码表示法来存储有符号整数。对于正数,其二进制表示就是它的原码;而对于负数,计算机使用该数绝对值的补码来表示。
- 正数的补码:等于其二进制表示。
- 负数的补码:是该数绝对值的反码加1。
计算按位非
要计算一个数的按位非,首先需要知道该数在计算机中的二进制表示。假设我们有一个32位系统,那么每个整数都由32个二进制位表示,包括符号位。对于正数,最左边的位(最高有效位)为0;对于负数,最高有效位为1。
步骤如下:
-
确定原始数值的二进制表示:
- 如果是正数,直接写出其二进制形式。
- 如果是负数,先写出其绝对值的二进制形式,然后计算补码。
-
应用按位非运算:
- 将步骤1得到的二进制数的每一位取反,即0变为1,1变为0。
-
转换回十进制数:
- 对于结果为正的情况,可以直接将其视为二进制数并转换成十进制。
- 对于结果为负的情况(即最高位为1),需要通过求补码的方法来确定其对应的十进制值。
-
考虑溢出:
- 在某些情况下,特别是当对最小的负数进行按位非时,可能会遇到溢出现象,这取决于系统的字长和是否有符号。
示例
以 ~10
为例,让我们一步步来计算:
-
确定10的二进制表示:
- 10的二进制表示为
0000 0000 0000 0000 0000 0000 0000 1010
(32位)。
- 10的二进制表示为
-
应用按位非运算:
- 翻转每一位后得到
1111 1111 1111 1111 1111 1111 1111 0101
。
- 翻转每一位后得到
-
转换回十进制数:
- 由于最高位是1,这是一个负数。为了找到它代表的十进制数,我们需要计算它的补码。我们再次对所有位取反,得到
0000 0000 0000 0000 0000 0000 0000 1010
,然后加1,得到0000 0000 0000 0000 0000 0000 0000 1011
,这是二进制的11。因为原来的数是一个负数,所以最终的结果是-11
。
- 由于最高位是1,这是一个负数。为了找到它代表的十进制数,我们需要计算它的补码。我们再次对所有位取反,得到
因此,~10
的结果是 -11
。
希望这个详细的解释能够帮助你更好地理解按位非运算符的工作原理。如果你有任何其他问题或需要进一步的帮助,请随时提问!
按位异或(^)
运算规则:当两个对应位不同时,结果位为 1,相同时结果位为 0。
计算示例:计算12 ^ 5,12的二进制是1100,5的二进制是0101,按位异或运算为1100 ^ 0101 = 1001,即十进制的9。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App