首页 > 技术文章 > 学习笔记——位运算符

wangzhebin 2021-03-22 16:10 原文

位运算符

位运算符(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;
    }
}

推荐阅读