首页 > 其他分享 >位运算

位运算

时间:2023-10-30 09:03:49浏览次数:25  
标签:11111111 右移 运算 00000000 取反 int 按位

数据在计算机中都是以01的形态进行存储,位运算可以直接对01进行操作,其效率自然很高,在Java源码中是很常见的。这里总结位运算的概念以及常见的操作,后续遇到会补充。

位运算符

位运算是需要使用位运算符的,位运算符有如下几种(本表以java语言中的位运算为标准):

含义 符号 简述
按位与 a & b 同一得 1
按位或 a | b 有一得 1
按位异或 a ^ b 相同得 0
按位取反 ~a 取反
左移 a << b 向左移动,低位补零,高位舍弃
带符号右移 a >> b 向右移动,高位补原有高位,低位舍弃
无符号右移 a >>> b 忽略符号位,空位都以0补齐

位运算优先级

~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|。

位运算符在日常开发中也是 有许多应用场景的,具体场景将在下边代码中展示:

按位或 |

/**
 * | 按位或 有一得1
 * 比较m, n之间,换成二进制后谁的1最多
 * 使用 按位或 | 计算 有一得一,与&清零不同的是使用 | 可以置1
 * @param m
 * @param n
 */
public static int  test2(int m ,int n) {
        // 7:111 8:0001 7|8 = 111(2) | 0001(2) = 1111(2) = 15
        // 6:011 7:111 6|7 = 011(2) | 111(2) = 111(2) = 7
        while ((m | m+1)<=n) {
            m = (m | m+1);
        }
        return m;
}

按位与 &

/**
 *  & 按位与 同一得1
 * 判断一个整数n是不是2的x次幂
 * 若n&(n-1)=0 则说明n是2的x次幂
 * 也可以这样说:循环结束后当ans=1时,说明n时2的x幂
 * 按位与 & : 同一得一,可用于清零操作
 * @param n 
 * @return ans  表示n转化成二进制数之后,1的个数
 */
public static int test1(int n) {
    int ans = 0;
    while (n != 0) {
        ans++;
        n &= (n-1);
        System.out.println(n);
    }
    return ans;
}

异或 ^

/**
 * ^ 异或 相同得0
 * 可用于交换两个变量的数值,不用到带三个变量
 * 交换律
 * @param a , b
 */
public static void test3(int a, int b) {
    a = a ^ b;
    // a^b ^ b = a
    b = a ^ b;
    // a^b ^ a = b
    a = a ^ b;
}

按位取反~

 /**
  * 取反 ~
  * 先对原数进行按位取反,然后减1,再进行取反得到一个数,最后加上负号即可
  *
  * 00000000 00000000 00000000 00000100 原值
  * 11111111 11111111 11111111 11111011 取反
  * 11111111 11111111 11111111 11111010 -1
  * 00000000 00000000 00000000 00000101 取反
  */
 public static void test4() {
     int a = 4;
     System.out.print(~4);
 }

左移 <<

/**
 * 左移 <<
 * 
 * 00000000 00000000 00000000 00000101 左移2位后,低位补0
 * 00000000 00000000 00000000 00010100 转为十进制为 20
 */
public static void test5() {
    int a = 5;
    System.out.print(a << 2);
}

右移 >>

/**
 * 右移 >> 高位补符号位 
 * 
 * 00000000 00000000 00000000 00000101 右移2位后,高位补0
 * 00000000 00000000 00000000 00000001 转为十进制为 1
 */
public static void test6() {
    int a = 5;
    System.out.print(a >> 2);
}

无符号右移 >>>

/**
 * 无符号右移 >>> 高位补0
 * 
 * >>>和>>的区别是:在执行运算时,>>>运算符的操作数高位补0,而>>运算符的操作数高位移入原来高位的值。 
 * 
 */
public static void test7() {

    /** 负数取值: 减一后按位取反 **/

    /**
     * -5 >> 2 情况
     * 11111111 11111111 11111111 11111011 -5 的二进制
     * 11111111 11111111 11111111 11111110 >> 2
     * 10000000 00000000 00000000 00000010 减1,按位取反,值为-2
     */
    System.out.println(-5 >> 2);// 结果是-2

    /**
     * -5 >>> 2 情况
     * 11111111 11111111 11111111 11111011 -5 的二进制
     * 00111111 11111111 11111111 11111110 >>> 2, 高位补0,此时为正数
     */
    System.out.println(-5 >>> 2);// 结果是1073741822
}

标签:11111111,右移,运算,00000000,取反,int,按位
From: https://www.cnblogs.com/mingshan/p/17793495.html

相关文章

  • pi的三种运算
    1#蒙卡洛特矩中圆算概率2importrandom3importtime4fromtqdmimporttqdm56count=07a=eval(input())8random.seed(125)9data_iter=tqdm(range(a),unit='Data')10fori,_inenumerate(data_iter):11data_iter.set_description('D......
  • 第 369 场周赛(简单位运算,分类讨论,dfs,树形dp)
     简单位运算模拟classSolution{public:intfindKOr(vector<int>&nums,intk){vector<int>bit(32,0);for(inti=0;i<31;i++){intcnt=0;for(autox:nums){if(x>>......
  • 形态学操作--4.梯度运算
    ......
  • 位运算学习笔记 【蒟蒻版】
    位运算学习笔记基本概念:位运算:顾名思义,就是按位运算的意思,一般指二进制下的位运算**"&"按位与运算与运算:两个位都为1时,结果才为1,否则为0例子:100001&101011---------100001代码:100001&101011"|"按位或运算或运算:两个位都为0时,结果才为0,否则为1......
  • JS加密/解密之逻辑运算符加密进阶篇
    前言 前篇给大家介绍了运算符不为人知的基础知识。他们的各种表达形式,今天我们从这个基础上,继续进一步告诉大家,如何对字符串进行加密处理。还是那句话,技术人不废话,直接晒代码。示例源代码//字符串加密示例letstr="HelloWorld";//加密letencryptedString=[[]+[]+......
  • 形态学--3.开运算和闭运算
    ......
  • 数据结构与算法(LeetCode)第一节:认识复杂度,对数器,二分法与异或运算
    一、认识复杂度1.评估算法优劣的核心指标:时间复杂度:当完成了表达式的建立,只要把最高阶项留下即可。低阶项都去掉,高阶项的系数也去掉,记为O(去掉系数的高阶项);​ 时间复杂度是衡量算法流程的复杂度的一种指标,该指标只与数据量有关,与过程之外的优化无关常见的时间复杂度(从好到坏)O......
  • DSPLearning_dayONE___________matlab实现DTFT里面的一些常用函数以及基本运算
    DSPmatlab实现\(\delta(n)\)的实现%matlab中坐标轴的横坐标和纵坐标是分开表示的n=-10:20;%横坐标的显示范围这个是确定了x轴的坐标范围delta=[zeros(1,10)1zeros(1,20)];%zeros(m,n)产生一个mxn的全零矩阵这个是每个x轴对应的y轴的值stem(n,delta);gridon......
  • JAVA中char类型加减乘除运算表达式返回类型
    我们都知道java中,如果char类型和int类型做加减法,那么char类型会被精度提升至int类型然后参与运算,返回的也是int类型的数据。那么如果表达式中参与运算的均为char类型,那么表达式返回的类型是什么呢?'A'-'a'经过简单测试,是int类型。charc='w';sb.append('A'+c-'a');......
  • JS加密/解密之那些不为人知的基础逻辑运算符
    不多说,直接上干货使用逻辑非运算符!和双重逻辑非运算符!!:例如![]、!![]、!0、!!0和!""、!!""。空字符串的转换:!""和!!""。数组和对象的类型转换:[]+[]、[]-[]、{}+[]和[]+{}。对象和原始值的自动拆箱:例如({valueOf:()=>5})+3。减法运算符的字符串转换:例如......