学习笔记——位运算符
位运算符
位运算符(positional operator)
位操作是程序设计中对位模式按位或二进制数的一元和二元操作。
在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多。
在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。
简介
位运算符用来对二进制位进行操作,Java中提供了如下表所示的位运算符:位运算符中,除 ~ 以外,其余均为二元运算符。
操作数只能为整型和字符型数据。
按位运算符有6个
& 按位与
| 按位或
^ 按位异或
~ 取反
>>右移
<< 左移
运算方法
1.按位与运算(&)
按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。(全真为真)
例如:
1 & 3的结果的是1
1的二进制表示为 0 0 0 0 0 0 1
3的二进制表示为 0 0 0 0 0 1 1
运算后得到的结果为 0 0 0 0 0 0 1,十进制表示就是1。
2.按位或运算(|)
按位或运算符“|”是双目运算符。 其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。(全假为假)
例如:
1 | 3 的结果为3
1的二进制表示为 0 0 0 0 0 0 1
3的二进制表示为 0 0 0 0 0 1 1
运算后得到的结果为 0 0 0 0 0 1 1,十进制表示就是3。
3.按位异或运算(^)
按位异或运算符“^”是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。(相同为假,不同为真)
例如:
65 ^ 90的结果为27
65的二进制表示为 0 1 0 0 0 0 0 1
90的二进制表示为 0 1 0 1 1 0 1 0
运算后得到的结果为0 0 0 1 1 0 1 1,十进制表示就是27
4.求反运算(~)
求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反,即对位求反:1变0, 0变1。
例如:
65的二进制表示为 0 1 0 0 0 0 0 1
取反后得到的表示为1 0 1 1 1 1 1 0
5.移位运算符
移位运算符把位按指定的值向左或向右移动,<< 向左移动,而 >> 向右移动,超过的位将丢失,而空出的位则补0,若最高为是1,则最高位补1。
小知识:
2<<1 = 2*2
2<<2 = 2*4
2>>1 = 2/2
同时,任何小数都可以通过>>0取整,如 3.1415926>>0 = 3
应用
题目来源: 2021.3.22力扣每日一题 —— 位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
提示:
请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
提示:
输入必须是长度为 32 的 二进制串 。
代码实现(Java)
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int cnt = 0 ;
while(n!=0){
if((n&1)==1){
cnt++;
}
n = n >>> 1;
}
return cnt;
}
}