位运算符(&,|,~,^,同或,>>,<<)

位运算是在二进制数的位级别上执行操作的一种运算。

1. &(按位与)
如果两个相应的位都为1,则结果为1,否则为0。
​
5 & 3 = 1
# 5 的二进制表示是 101
# 3 的二进制表示是 011
# 按位与后得到     001,即 1

​

2. |(按位或)
如果两个相应的位至少有一个为1,则结果为1,否则为0。
5 | 3 = 7
# 5 的二进制表示是 101,
#3 的二进制表示是  011,
#按位或后得到      111,  即 7
3.  ~(按位取反)
对数的每个位执行取反操作,即0变为1,1变为0。
~5 = -6
# 5 的二进制表示是 101,按位取反后得到 010,即 -6
print(~5)
#取反使用8位二进制数表示
#将 5 的二进制表示取反。
# 5 的二进制表示是 00000101,
# 取反后得到      11111010。 #-6

#6 的二进制表示为  00000110。
#取反: 对绝对值的二进制表示进行取反操作得到 11111001。
#加1: 将取反后的结果加1得到 11111010。

#取反(那得到的就是负数了) #8位的二进制.
#然后怎么知道是什么
#11111010 首先先-1
#11111001
#然后取反
#00000110 #6
#前面有负号,所以是-6
4. ^(按位异或)
如果两个相应的位不相同,则结果为不同为1,否则为相同为0。
5 ^ 3 = 6
# 5 的二进制表示是 101
# 3 的二进制表示是 011
# 按位异或后得到   110,即 6
5.  同或(Not XOR)
与异或相反,如果两个相应的位相同,则结果为1,否则为0。
6.<<(左移)
将一个数的所有位向左移动指定的位数。左移的话是不丢掉原本的数字的,最右补充0
5 << 1 = 10
# 5 的二进制表示是 101,
# 左移一位后得到  1010,即 10
7.>>(右移)
将一个数的所有位向右移动指定的位数。右移要丢掉原本的最右侧数字,最左补零(默认)不用管
5 >> 1 = 2
# 5 的二进制表示是 101
# 右移一位后得到    10,即 2

可以使用逻辑非运算符 `!`、按位取反运算符 `~`、按位与运算符 `&`、按位异或运算符 `^`、按位或运算符 `|`、加法运算符 `+`、左移位运算符 `<<` 和右移位运算符 `>>` 来实现 `evenBits()` 函数。 以下是 `evenBits()` 的实现代码: ```java public static int evenBits() { int result = 0; result = !result; result = ~result; result = result & 0x55555555; result = result ^ 0x55555555; result = result | (result << 1); result = result | (result << 2); result = result | (result << 4); result = result | (result << 8); result = result | (result << 16); result = result >> 1; result = result + (result << 1); return result; } ``` 示例: ``` evenBits() = 0xAAAAAAAA 0xAAAAAAAA = 0b10101010101010101010101010101010 ``` 解释:首先,我们将一个整数变量 `result` 初始化为 0,并使用逻辑非运算符 `!` 将其转换为布尔值,然后使用按位取反运算符 `~` 将其取反。这将生成一个所有位都为 1 的二进制数。接下来,我们使用按位与运算符 `&` 将其与 0x55555555 进行按位与运算,以保留所有偶数位上的位。然后,我们使用按位异或运算符 `^` 将结果与 0x55555555 进行按位异或运算,以将所有奇数位上的位设置为 0。接下来,我们使用左移位运算符 `<<` 来将所有偶数位上的位复制到相邻的奇数位上。具体来说,我们先将结果与自己左移 1 位的结果进行按位或运算,再将结果与自己左移 2 位的结果进行按位或运算,以此类推,直到将所有偶数位复制到所有奇数位上。最后,我们使用右移位运算符 `>>` 将所有位向右移动 1 位,以将所有奇数位上的位设置为 0。然后,我们使用加法运算符 `+` 将结果与自己左移 1 位的结果进行相加,以将所有偶数位上的位设置为 1。最后返回结果即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值