移位操作符和位操作符(从概念到相关算法题详解)

news2024/9/22 23:16:26

目录

概念

基础知识

左移操作符(<<)

右移操作符(>>)

按位与(&) 

按位或(|) 

异或(^)

相关算法题

1.不能创建临时变量(第三个变量),实现俩个数的交换

方法1:

方法2:

写一个方法,返回参数中二进制中1的个数

方法1:

方法2:

方法3:

俩个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

方法1

方法2

获取一个整数二进制序列中所有偶数位和奇数位,分别打印出二进制序列


概念

基础知识

首先,这里介绍的移位操作符和位操作符,针对的都整型,且针对都是整数在内存中存储的二进制位(以补码的形式存储),正数的原码,反码,补码相同,负数的反码等于负数的原码符号位不变,其它位,按位取反,负数的补码等于负数的反码+1

左移操作符(<<)

左移操作符是将整型的补码向左移动一位

计算规则:左边丢弃,右边补零

代码示例1

public class Test8 {
    public static void main(String[] args) {
        int a = 7;
        int b = a<<1;
        System.out.println(a);
        System.out.println(b);
    }
}

运行结果

分析:

注意,这里a的值没有改变,只是a把左移1位的值赋给b,a本身并没有改变. 

代码实例2

public class Test8 {
    public static void main(String[] args) {
        int a = -7;
        int b = a<<1;
        System.out.println(a);
        System.out.println(b);
    }
}

 运行结果

分析

 

根据上面俩个代码,我们不难发现,左移有乘2的特点

右移操作符(>>)

右移包括算数右移和逻辑右移
算数右移:整型的补码向右移动1位,右边丢弃,如果是正数,左边补零,如果是负数,左边补1
逻辑右移:整型的补码向右移动1位,右边丢弃,无论正负,左边都补0(基本不用)

代码示例1

public class Test8 {
    public static void main(String[] args) {
        int a = 7;
        int b = a>>1;
        System.out.println(a);
        System.out.println(b);
    }
}

运行结果

分析

代码示例2

public class Test8 {
    public static void main(String[] args) {
        int a = -7;
        int b = a>>1;
        System.out.println(a);
        System.out.println(b);
    }
}

 运行结果

分析

 

按位与(&) 

运算规则:有0为0,全1得1  

代码示例

public class Test8 {
    public static void main(String[] args) {
        int a = 3;
        int b = -5;
        int c = a&b;
        System.out.println(c);
    }
}

运行结果

分析

 

特点:

n&1可以得到n的二进制的最低位 ,借助右移,可以得到二进制表达的每一位

n&(n-1)可以把n的二进制位最后一个1去掉(本质是n-1借了n二进制最后的1的位,因此按位与过后,就可以把n二进制的最后的1去掉,很巧妙这个特性,也很实用),因此可以用来数二进制位1的个数,还可以判断1个数是否是2的多少次方(2的次方数的二进制都只有一个1(最高位),比如2^0 1  2^1 10 2^2 100 2^3 1000)

 

按位或(|) 

运算规则:有1得1,全0为0 

代码示例

public class Test8 {
    public static void main(String[] args) {
        int a = 3;
        int b = -5;
        int c = a|b;
        System.out.println(c);
    }

运行结果

分析

异或(^)

运算规则:相同为0,相异为1

代码示例

public class Test8 {
    public static void main(String[] args) {
        int a = 3;
        int b = -5;
        int c = a^b;
        System.out.println(c);
    }
}

 运行结果

分析

 异或操作符的特点

相同的俩个数异或结果位0   3^3 = 0    a^a = 0
0异或任何数,结果位这个数本身 0^2 = 2  0^a = a
异或支持交换律   2^2^5 = 5   2^5^2 = 5      a ^a^b = b,a^b^a=b

相关算法题

例题大家按顺序看哈,前面提到的公式方法,下面的题目就不提了

1.不能创建临时变量(第三个变量),实现俩个数的交换

方法1:

public class Test8 {
    public static void main(String[] args) {
        int a = 2;
        int b = 3;
        System.out.println("交换前: "+"a= "+a+" b= "+b);
        a = a+b;
        b = a-b;
        a = a-b;
        System.out.println("交换后: "+"a= "+a+" b= "+b);
    }
}

我们可以巧妙的运用加减法,来做到交换a,b俩个值的目的
弊端:a+b可能数值过大越界 

方法2:

public class Test8 {
    public static void main(String[] args) {
        int a = 2;
        int b = 3;
        System.out.println("交换前: "+"a= "+a+" b= "+b);
        a = a^b;
        b = a^b;
        a = a^b;
        System.out.println("交换后: "+"a= "+a+" b= "+b);
    }
}

这里用到了异或交换律等特点,先不讨论上述代码,假设现在有c = a ^ b,那么如果我们拿a去异或a^b得到的就是b,拿b异或a^b得到的就是a.基于此,我们是可以通过异或来进行交换的.先拿把a^b的值赋值给a,再通过异或b得到a的值,赋值给b.最后再拿a^b异或a(此时a = a^b,b = a),得到的就是a.

写一个方法,返回参数中二进制中1的个数

方法1:

思路:对于10进制的数来说,我们可以通过%10得到10进制数的最后1位,再配合/10,我们可以依次从右向左得到10进制数的每一位,同理,对于2进制的数,我们通过%2可以得到2进制数的最后1位,再配合/2,我们可以依次从右向左得到2进制数的每一位
基于此我们可以通过%2,/2得到2进制数的每一位,再判断得到的每一位是否等于1,统计为1的个数即可

代码

   public static int func(int n){
        int count = 0;
        int ret = n;
        while(ret!=0){
            if(ret%2 == 1){
                count++;
            }
            ret = ret/2;
        }
        return count;
    }

 弊端:负数的时候,此方法不可用.C语言中可以把参数设置为无符号整型 unsigned int,java俺还没想到啥改进的方法

方法2:

根据按位与的特点,我们可以知道n&1,可以得到二进制位的最低位.那么再配合右移就可以得到n二进制位的每一位.

   public static int func2(int n){
        int count = 0;
        for (int i = 0; i < 32; i++) {
            if(((n>>i)&1) == 1 ){
                count++;
            }
        }
        return count;
    }

弊端:循环必定会循环32次

方法3:

根据按位与的特点,n&(n-1),可以去掉n二进制表达最后的1

    public static int func3(int n){
        int count = 0;
        while(n!=0){
            n = n&(n-1);
            count++;
        }
        return count;
    }

俩个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

方法1

得到m和n二进制位的每一位,进行比较

    public static int func1(int m,int n){
        int count = 0;
        for (int i = 0; i < 32; i++) {
            if(((m>>i)&1) != ((n>>i)&1)){
                count++;
            }
        }
        return count;
    }

方法2

让m和n进行异或得到ret,再数ret二进制表达中有多少个1即可

   public static int func2(int m,int n){
        int count = 0;
        int ret = m&n;
        while (ret != 0){
            ret = ret&(ret-1);
            count++;
        }
        return count;
    }

获取一个整数二进制序列中所有偶数位和奇数位,分别打印出二进制序列

一样通过&1和右移来获取二进制表达的每一位

public static void func(int n){
        //获取奇数位数字
        for (int i = 30; i >=0 ; i=i-2) {
            System.out.print((n>>i)&1);
        }
        System.out.println();
        //获取偶数位数字
        for (int i = 31; i >=1 ; i++) {
            System.out.print((n>>i)&1);
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2019年数维杯国际大学生数学建模C题猪肉价格波动分析求解全过程文档及程序

2019年数维杯国际大学生数学建模 C题 猪肉价格波动分析 问题重述&#xff1a; 中国是一个育种大国。猪肉产业在畜牧业中起着主导作用。同时&#xff0c;猪肉已成为人们餐桌上的主要肉类来源之一。随着人口的增加&#xff0c;消费和生活也得到了改善。 2018年8月3日&#xff0…

Android Studio中设置Compose 代码模版

File Templates 有两种方式能找到编辑File Templates的入口 在 File -> New -> Edit File Templates 或者 在项目结构目录中点击右键菜单 New -> Edit File Templates 在设置界面中的 Editor -> File and Code Templates #if (${PACKAGE_NAME} && ${…

dwg怎么转成dxf格式?手机也能轻松操作

dwg怎么转成dxf格式呢&#xff1f;相信很多小伙伴应该知道这两种格式都是CAD图纸中的一种&#xff0c;那么它们有什么区别呢&#xff1f;第一&#xff0c;性质不同dwg图形文件是计算机辅助设计软件AutoCAD用来保存设计数据的专有文件格式。dxf图形文件是DWG格式的ASCII格式变体…

Codeforces Global Round 14 E Phoenix and Computers

大意&#xff1a; 一排电脑&#xff0c;每次可以选择打开一台电脑&#xff0c;如果某一台电脑相邻的左边和右边都被打开了&#xff0c;它会自动打开。问打开n台电脑的方案数 思路&#xff1a; O(n^3)做法 不难发现&#xff0c;在操作过程中&#xff0c;一台台电脑其实就是被…

电磁明渠流量计怎么安装?

1、设备介绍 电磁明渠流量计是由流量显示仪、流速计、液位计组成的流速面积法测流量的明渠测量流量系统。 工作原理&#xff1a;基于法拉第电磁感应定律&#xff0c;当导电流体流过电磁式流速仪的磁场时&#xff0c;在与流速和磁场两者相垂直的方向就会产生与平均流速成正比的…

C++ 数学与算法系列之牛顿、二分迭代法求解非线性方程

1. 前言 前文介绍了如何使用“高斯消元法”求解线性方程组。 本文秉承有始有终的态度&#xff0c;继续介绍“非线性方程”的求解算法。 本文将介绍 2 个非线性方程算法&#xff1a; 牛顿迭代法。二分迭代法。 牛顿迭代法&#xff08;Newtons method&#xff09;又称为牛顿…

千万别熬夜:只有睡觉,才能修复DNA损伤

睡眠是人体的一种修复过程&#xff0c;可以恢复精神和解除疲劳。人的一生中&#xff0c;大约三分之一的时间是在睡眠中度过&#xff0c;良好的睡眠是国际社会公认的三项健康标准之一&#xff0c;而睡眠时间过短或睡眠不佳均会影响健康。在中国&#xff0c;超3亿人存在睡眠障碍、…

基于智能电控柜原理的物联网云平台方案

本方案基于智能电控柜的原理&#xff0c;通过无线传输模块将现场采集到的数据经过无线网络发送到物联网云平台&#xff0c;同时可通过云组态和数据中心将现场画面所见即所得的同步到互联网终端。 用户在安装有监控软件后&#xff0c;可以用手机 APP或者在云平台上直接控制电控柜…

Ubuntu自动登录脚本,expect自动切换用户,xshell自动登录脚本

Ubuntu自动登录脚本&#xff0c;expect自动切换用户&#xff0c;xshell自动登录脚本一、!/usr/bin/expect -f的意义二、spawn命令行&#xff1a;三、send命令&#xff1a;四、expect五、interact命令&#xff1a;六、xshell自动化脚本1、怎么使用脚本2、编写脚本3、vbs的不足本…

https访问流程详解

1. 基础知识 1.1 https起源 鲍勃有两把钥匙&#xff0c;一把是公钥&#xff0c;另一把是私钥。 鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。 苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密&#xff0c;就可以达到保密的效果。 鲍勃收信后&#xf…

jvm-sandbox:基础了解及demo演示

文章目录一、基础准备-被测应用二、代码编写-自定义Module三、jvm-sandbox安装及基础命令四、jvm-sandbox demo演示4.1、改变方法返回4.2、异常注入五、资源链接一、基础准备-被测应用 准备&#xff1a;先创建一个基础的SpringBoot项目并打jar包后在服务器启动 RestControll…

TP5反序列化利用链

说明 该文章来源于同事lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明TP5反序列化利用链下图是Mochazz 大佬画的非常优雅的一张调用链图Action&#xff01;CUT&#xff01;TP5反序列化利用链 本文以第二人称视角重点谈谈给…

max蒙皮动画+动作

首先关于max人物动画&#xff01;如何制作&#xff01; 首先&#xff01; 我们要准备一个模型&#xff01;人物的模型&#xff01; 这是一个人物模型&#xff01;obj的&#xff01;没有任何东西&#xff01;你也可以选择其他&#xff0c;我是从虚幻里面直接导出的&#xff0…

太卷了,华为某领导说招外包只要985!

你听说过华为od吗&#xff1f;od是outsourcing dispatch&#xff08;外包派遣&#xff09;的简称&#xff0c;虽然华为每年会挑选一部分优秀的od员工转为华为正编员工&#xff0c;但od本质上还是外包。最近一位华为员工爆料&#xff1a;太卷了&#xff01;领导说招od员工也要98…

玻纤效应对skew的影响(二)

玻纤效应对对内skew的影响 参数对对内Skew的影响 在一个差分对中&#xff0c;对内skew是由PN走线Dk的差异造成的。导致Dk有差异的原因有很多&#xff0c;例如走线位置&#xff0c;core和pp的玻璃束位置&#xff0c;走线宽度等等。但是这些因素影响角度也不同&#xff0c;下图…

应用程序已被Java 安全阻止-- 如何全局设置Java 控制面板参数

最近遇到一个客户问题&#xff0c;客户方存在一个使用场景为使用IE访问一个页面 之后通过点击页面的按钮调起一个applet程序&#xff0c;结果遇到了一个弹窗告警&#xff1a;应用程序已被Java安全阻止。 对于这个问题 解决方案有两个&#xff1a; 1.将访问的页面站点加入到例外…

BGP在数据中心的应用2——BGP如何适应数据中心网络

注&#xff1a; 本文根据《BGP in the Datacenter》整理&#xff0c;有兴趣和英文阅读能力的朋友可以直接看原文&#xff1a;https://www.oreilly.com/library/view/bgp-in-the/9781491983416/上一部分笔记请参考&#xff1a;https://blog.csdn.net/tushanpeipei/article/deta…

echarts中得一些使用技巧和方法

一、取数据的最大值&#xff1a; let maxNum maxData.sort((a, b) > b - a)[0]&#xff1b; 二、echarts 自适应 所有的echarts里面设置了字体根据最外层body的字体来改变大小 // app.vue中的代码 // 页面开始加载时修改font-size var html document.getElementsByTagN…

VGG详解

入门小菜鸟&#xff0c;希望像做笔记记录自己学的东西&#xff0c;也希望能帮助到同样入门的人&#xff0c;更希望大佬们帮忙纠错啦~侵权立删。 ✨完整代码在我的github上&#xff0c;有需要的朋友可以康康✨ https://github.com/tt-s-t/Deep-Learning.git 目录 一、VGG网络的…

小侃设计模式(二十)-迭代器模式

1.概述 迭代器模式&#xff08;Iterator Pattern&#xff09;提供了一种方法访问一个容器对象中各个元素&#xff0c;而又不暴露该对象的内部细节。迭代器模式用于访问集合中的元素而不需要知道集合底层的数据形式。在JAVA语言中&#xff0c;迭代器模式已经成为其中不可缺少的…