【JAVA】拾遗位运算

JDK源码内的位运算是真的多啊,看得头晕,今天就来整理一下java中的位运算。

位运算有以下几种:

  • &    逻辑与,按位进行与运算
  • |      逻辑或,按位进行或运算
  • ~     逻辑非运算,按位取反
  • ^      逻辑异或运算
  • <<   位左移运算
  • >>   位右移运算

&    逻辑与,按位进行与运算

1&1=1
1&0=0
0&0=0

|    逻辑或,按位进行或运算

1|1=1
1|0=1
0|0=0

~    逻辑非运算,按位取反

这里涉及到原码、反码与补码

正数的原码反码补码都一样,负数的反码为其原码符号位后按位取反,补码为其反码+1

在计算机中,使用补码表示一个负数,想要知道该负数的十进制数是多少,必须将补码转化为原码,才能直接转十进制。

例如:

11101,第一位为符号位,则该二进制数为负数,其为一个负数的补码,先由补码转反码

即反码=补码-1,反码=11100

原码=反码除符号位,其他按位取反,原码=10011,则该负数为-3

那么~3=~00011,第一位为符号位

~00011按位取反为11100,其为一个负数的补码,则反码为11011,原码为10100,即为-4

当然只要记住一个公式就好

~x=-(x+1)


~3=-(3+1)=-4
~(-4)=-(-4+1)=3


^    逻辑异或运算

1^2=3
1的二进制01,2的二进制10,按位进行异或运算,相异为1

01
10
——
11

则结果为3

<<    位左移运算,箭头往左边指,即左移

1<<2=4

1的二进制为1,左移2位,则从右边开始添加2个0,变成100,即为4
左移相当于乘法,1<<2=1*2的2次方,即为4



>>    位右移运算,箭头往右边指,即右移

15>>2=3 

15的二进制为1111,右移2位,变为0011,即为3
右移相当于除法,15/2的2次方,等于3.75,舍去小数点,即为3

那我们在日常的工作中,也用不到位运算啊,而且位运算不易理解,可读性又差

不过呢,理解位运算,可以帮助我们去理解jdk中的源码。位运算只是不易被人理解,却易被机器理解,机器执行位运算的效率非常高

下面来几道有趣的试题。


有8瓶水,其中一瓶有剧毒,其他无毒。老鼠喝下毒药一个小时后即死。现在给你3只老鼠,如何在一个小时后测试出哪瓶水中有毒药?

这道题,如果没学过二进制的人,估计很难下手。

我们将8瓶水依次编号,分别为0,1,2,3,4,5,6,7。

三只老鼠,分别作为一个bit位,一共3个bit位。

那么有:

000=0

001=1

010=2

011=3

100=4

101=5

110=6

111=7

左边三位数其中的1代表老鼠喝掉当前序号的水,0代表没喝。右边的数代表水的序号。

如果第一只老鼠死了,第二只老鼠没死,第三只老鼠死了。第一只老鼠死了必然说明它喝的水中有一瓶是毒药,则三位二进制第一位为1,则4,5,6,7号水其中一瓶有毒;第二只老鼠没死,说明喝的水中必然没有毒药,排除掉6,7,此时仅剩4,5;第三只老鼠死了,则直接取到5,说明序号为5的水中有毒。

当然也可以直接利用101直接得出5


再来一道:

有一个数组,其中有一个数字不重复,其余数字全部重复一次,找出这个不重复的数字。

这道题利用异或运算,相同的数字异或为0,0再与那个单独的数字异或,就可以得到那个不重复的数字

package com.yang.testBit;

public class TestBitMain {

    public static int getUniqueNum(int arr[]) {
        int num = -1;
        if (arr == null || arr.length == 0) {
            return num;
        }
        num = arr[0];
        int len = arr.length;
        for (int i = 1; i < len; i++) {
            num = num ^ arr[i];
        }
        return num;
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 2, 3};
        System.out.println(getUniqueNum(arr));
    }
}

输出:


在上面那道题改变一下条件:

如果不重复的数字有两个怎么办?

解决办法是先遍历一遍数组,异或得到一个数num,这个数就是只出现一次的那两个数异或的结果,然后找到num最低为1的位(假设是第i位),再次遍历数组,按第i位为1和为0将数组分为两个数组,此时只出现一次的两个数就被分到了不同的组,然后对每个组按照上面最初的方法找出来就可以了。


再来一道:

交换两个数?

我们利用异或运算,a^b^b=a^(b^b)=a^0=a

例如:

    public static void swap() {
        int a = 3;
        int b = 5;
        System.out.println("交换前:a=" + a + " b=" + b);
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.println("交换后:a=" + a + " b=" + b);
    }

输出:


位运算也是挺有趣的嘛

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略与效果评估体系,涵盖当前企业传播面临的预算、资源、内容与效果评估四大挑战,并深入分析2025年新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势与发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化与GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理与舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率与ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放与GEO优化,提升品牌在AI搜索中的权威性与可见性;④通过数据驱动评估体系量化品牌影响力与销售转化效果。; 阅读建议:建议结合文中提供的实操清单、案例分析与工具指南进行系统学习,重点关注媒体适配性策略与GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunAlwaysOnline

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值