Java中关于位运算的面试题

位运算的效率是最高的,因为位位运算是直接对二进制进行操作

位运算只能应用于整型和char类型(char类型可以看做是特殊的无符号的整形)

面试题:
    a: 判断一个数是否是奇数 a & 1 == 1;
    b: 对2 ^ n 取余。 a & (2^n - 1);
    c: 如何判断一个数是否是2^n a & (a-1) == 0;
    d: 两个整数之间的交换;
    e: 用最有效率的方式求2 * 8的值 2 << 3;

a: 判断一个数是否是奇数 a & 1 == 1;

/*
判断一个数是否是奇数?
    特点:最低位为1.
    a & 1 == 1;
*/
class OperatorDemo1 {
    public static void main(String[] args) {
        int a = -2018;
        // System.out.println(a % 2 == 1);
        // System.out.println(a % 2 != 1);
        System.out.println((a & 1) == 1);
    }
}

b: 对2 ^ n 取余。 a & (2^n - 1);

/*
对2的n次幂取余,都可以转换成位运算。
2^n:
    1101 1101
%    0100 0000

    1101 1101
&    0011 1111

*/
class OperatorDemo3 {
    public static void main(String[] args) {
        int a = 2019;
        System.out.println(a % 64);
        System.out.println(a & (64 - 1));

        /*System.out.println(a % 78);
        System.out.println(a & (78 - 1));*/
    }
}

c: 如何判断一个数是否是2^n

a & (a-1) == 0;

/*
判断一个数是否是2的n次幂?
    2^n:因子都是2;
    时间复杂度:logn;

能否在常量时间复杂度内, 判断一个数是否是2的n次幂。
    2^n的存储特点:只有一个1,后面全部是0.
    (a & (a - 1)) == 0

    0100 0000
&    0011 1111
    0000 0000

    0101 0000
&    0100 1111
    0100 0000
*/

class OperatorDemo4 {
    public static void main(String[] args) {
        int a = 1024;
        System.out.println((a & (a - 1)) == 0);
    }
}

d: 两个整数之间的交换;

/*
面试题
    两个整数变量的交换.
*/

class OperatorDemo5 {
    public static void main(String[] args) {
        // 方式一
        /*int a = 4;
        int b = 3;
        System.out.println("a=" + a + ", b=" + b);
        int temp = a;
        a = b;
        b = temp;
        System.out.println("a=" + a + ", b=" + b);*/

        // 方式二
        // 加法和减法互为逆运算。
        /*int a = 4;
        int b = 3;
        System.out.println("a=" + a + ", b=" + b);
        a = a + b; // a = 4 + 3, b = 3;
        b = a - b; // a = 4 + 3, b = 4 + 3 - 3 = 4;
        a = a - b; // a = 4 + 3 - 4 = 3, b = 4;
        System.out.println("a=" + a + ", b=" + b);*/

        // 方式三
        /*int a = 4;
        int b = 3;
        System.out.println("a=" + a + ", b=" + b);
        a = a ^ b; // a = 4 ^ 3, b = 3
        b = a ^ b; // a = 4 ^ 3, b = 4 ^ 3 ^ 3 = 4;
        a = a ^ b; // a = 4 ^ 3 ^ 4 = 3, b = 4;
        System.out.println("a=" + a + ", b=" + b);*/

        // 方式四
        int a = 4;
        int b = 3;
        System.out.println("a=" + a + ", b=" + b);
        /*a = a ^ b;
        b = b ^ a;
        a = a ^ b; */
        // a ^= b ^= a ^= b;
        a = (a ^ b) ^ (b = a); //工作中千万别这样写, 太show了。写代码,简洁易懂。
        System.out.println("a=" + a + ", b=" + b);
    }
}

e: 用最有效率的方式求2 * 8的值 2 << 3;

/*
<< 左移: 低位补0,高位丢弃
>> 右移: 高位补符号位, 低位丢弃
>>>无符号右移: 高位补0,低位丢弃

注意事项;
    左移:左移n个单位,相当于乘以2^n;
    右移: 右移n个单位,相当于除以2^n;

    对于移位运算符来说,当操作数超出了字长时,实际移动 n mod 字长 个单位。

练习:
    用最有效率的方式写出计算2乘以8的结果
    2 << 3
*/

class OperatorDemo7 {
    public static void main(String[] args) {
        int a = 192;
        System.out.println(a << 2); // 192 * 4 = 768
        System.out.println(a >> 2); // 192 * 4 = 48
        System.out.println(-a >> 2); // -192 * 4 = -48

        System.out.println(a >>> 2);// 48
        System.out.println(-a >>> 2); // 很大的整数

        System.out.println("-----------------------");
        a = 64;
        System.out.println(a >>> 32);
        System.out.println(a << 32);
        System.out.println(a >> 32);
        System.out.println(a >> 33);
        System.out.println(a >> -31);         

    }
}

/*
192:
    0000 0000 0000 0000 0000 0000 1100 0000
<<  2
    0000 0000 0000 0000 0000 0011 0000 0000

192:
    0000 0000 0000 0000 0000 0000 1100 0000
>>  2
    0000 0000 0000 0000 0000 0000 0011 0000

-192:
    1111 1111 1111 1111 1111 1111 0100 0000
>> 2
    1111 1111 1111 1111 1111 1111 1101 0000

192:
    0000 0000 0000 0000 0000 0000 1100 0000
>>>  2
    0000 0000 0000 0000 0000 0000 0011 0000

-192:
    1111 1111 1111 1111 1111 1111 0100 0000
>>> 2
    0011 1111 1111 1111 1111 1111 1101 0000
*/

原文地址:https://www.cnblogs.com/zhaoyuan72/p/11082522.html

时间: 2024-11-08 12:01:59

Java中关于位运算的面试题的相关文章

java中的位运算

刚才在imooc看php基础发现一个特别容易让我们理解的描述[关于异或运算的] 之前学习java的时候 位运算有4种,当时是这样记录的: &  按位与 (and) 两个对应二进制都为1则为1,其余全为0 |   按位或(or) 两个二进制数有一个为1则为1,只有两个0才为0 ~  按位非(NOT) 二进制中取反 ^  按位异或(XOR) 两个二进制中相同为则为0,不同则为1             其实最难以理解的就是这个异或运算. 直接搬过来(原网址点我): 我们可以从投票的角度来理解逻辑运算

java中通过位运算实现多个状态的判断

通过 <<  |  & ~ 位运算,实现同时拥有多个状态 通过 << 定义数据的状态 public interface LogConstants { /** * 消耗标记 */ short COST_ASSET = 1 << 0; short COST_GOLD = 1 << 1; short COST_BINDGOLD = 1 << 2; short COST_SOPH = 1 << 3; short COST_STRSOU

java中的位运算及移位运算

为了方便对二进制位进行操作,Java给我们提供了以下四个二进制位操作符: &    按位与 |     按位或 ^    按位异或 ~    按位取反 Java中有三个移位运算符: 左移:<<                        丢弃最高位,0补最低位:num << 1,相当于num乘以2 带符号右移:>>               符号位不变,左边补上符号位:num >> 1,相当于num除以2 无符号右移:>>>  

Java中有关构造函数的一道笔试题解析

Java中有关构造函数的一道笔试题解析 1.具体题目如下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与class同名 C. constructor在一个对象被new时执行 D.一个class只能定义一个constructor 2.解析说明 (1)class中的构造函数是可以省略的 /** * @Title:User.java * @Package:com.you.user.model * @Descrip

C#位运算示例和enum中的位运算

今天在项目中遇到按位或组合权限串的问题: 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了. 如: purview = k2|k3; // 赋给添加和删除权限 当需要判断在权限串中是否拥有某一权限时,就需要进行按位与. 如: if((purview & k1) >0)//判断此权限串是否拥有添加权限,结果>0 则进入if语句代码块中 { ....

Java中的表达式运算

1.问题背景    以下代码运行的结果为:    A.a的值:8   b的值:7           B.a的值:8  b的值:8    C.a的值:9   b的值:7           D.a的值:9  b的值:8 /** * */ package com.you.model; /** * @author YouHaidong * */ public class AB { /** * @param args */ public static void main(String[] args)

关于c语言中的位运算。。。

位运算是一种针对二进制数的一种运算 位运算 共有六种 都有其对应得操作符号 &      (and)      位于 |        (or)         位或 ~      (not)        取反 ^       (xor)        异或 >>    (shr)    右移一位 <<    (shl)     左移一位 运算说明: === 1. and运算 === and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位.这可

枚举中的位运算

为什么枚举中位运算都可以使用并运算? 1.  什么是枚举中的位运算? 例如 int a = 1 << 0; //1左移0位    1*2^0 = 1; int b = 1 << 1; //1左移1位   1*2^1 = 2; int c = 1 << 2; //1左移2位   1*2^2 = 4; int d = 1 << 3; //1左移3位   1*2^3 = 8; 并运算 a | b 01 10 -------------- 11 ==1+2 int

C/C++中的位运算

位运算     位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有:     &(按位与).|(按位或).^(按位异或).~ (按位取反). 其中,按位取反运算符是单目运算符,其余均为双目运算符.     位运算符的优先级从高到低,依次为~.&.^.|, 其中~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符.    (1)按位与运算符(&)