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/* 2判断一个数是否是奇数? 3 特点:最低位为1. 4 a & 1 == 1; 5*/ 6class OperatorDemo1 { 7 public static void main(String[] args) { 8 int a = -2018; 9 // System.out.println(a % 2 == 1); 10 // System.out.println(a % 2 != 1); 11 System.out.println((a & 1) == 1); 12 } 13}

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

1/* 2对2的n次幂取余,都可以转换成位运算。 32^n: 4 1101 1101 5% 0100 0000 6 7 1101 1101 8& 0011 1111 9 10*/ 11class OperatorDemo3 { 12 public static void main(String[] args) { 13 int a = 2019; 14 System.out.println(a % 64); 15 System.out.println(a & (64 - 1)); 16 17 /*System.out.println(a % 78); 18 System.out.println(a & (78 - 1));*/ 19 } 20}

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

     a & (a-1) == 0;

1/* 2判断一个数是否是2的n次幂? 3 2^n:因子都是2; 4 时间复杂度:logn; 5 6能否在常量时间复杂度内, 判断一个数是否是2的n次幂。 7 2^n的存储特点:只有一个1,后面全部是0. 8 (a & (a - 1)) == 0 9 10 0100 0000 11& 0011 1111 12 0000 0000 13 14 0101 0000 15& 0100 1111 16 0100 0000 17*/ 18 19class OperatorDemo4 { 20 public static void main(String[] args) { 21 int a = 1024; 22 System.out.println((a & (a - 1)) == 0); 23 } 24}

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

1/* 2面试题 3 两个整数变量的交换. 4*/ 5 6class OperatorDemo5 { 7 public static void main(String[] args) { 8 // 方式一 9 /*int a = 4; 10 int b = 3; 11 System.out.println("a=" + a + ", b=" + b); 12 int temp = a; 13 a = b; 14 b = temp; 15 System.out.println("a=" + a + ", b=" + b);*/ 16 17 // 方式二 18 // 加法和减法互为逆运算。 19 /*int a = 4; 20 int b = 3; 21 System.out.println("a=" + a + ", b=" + b); 22 a = a + b; // a = 4 + 3, b = 3; 23 b = a - b; // a = 4 + 3, b = 4 + 3 - 3 = 4; 24 a = a - b; // a = 4 + 3 - 4 = 3, b = 4; 25 System.out.println("a=" + a + ", b=" + b);*/ 26 27 // 方式三 28 /*int a = 4; 29 int b = 3; 30 System.out.println("a=" + a + ", b=" + b); 31 a = a ^ b; // a = 4 ^ 3, b = 3 32 b = a ^ b; // a = 4 ^ 3, b = 4 ^ 3 ^ 3 = 4; 33 a = a ^ b; // a = 4 ^ 3 ^ 4 = 3, b = 4; 34 System.out.println("a=" + a + ", b=" + b);*/ 35 36 // 方式四 37 int a = 4; 38 int b = 3; 39 System.out.println("a=" + a + ", b=" + b); 40 /*a = a ^ b; 41 b = b ^ a; 42 a = a ^ b; */ 43 // a ^= b ^= a ^= b; 44 a = (a ^ b) ^ (b = a); //工作中千万别这样写, 太show了。写代码,简洁易懂。 45 System.out.println("a=" + a + ", b=" + b); 46 } 47}

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

1/* 2<< 左移: 低位补0,高位丢弃 3>> 右移: 高位补符号位, 低位丢弃 4>>>无符号右移: 高位补0,低位丢弃 5 6注意事项; 7 左移:左移n个单位,相当于乘以2^n; 8 右移: 右移n个单位,相当于除以2^n; 9 10 对于移位运算符来说,当操作数超出了字长时,实际移动 n mod 字长 个单位。 11 12练习: 13 用最有效率的方式写出计算2乘以8的结果 14 2 << 3 15*/ 16 17class OperatorDemo7 { 18 public static void main(String[] args) { 19 int a = 192; 20 System.out.println(a << 2); // 192 * 4 = 768 21 System.out.println(a >> 2); // 192 * 4 = 48 22 System.out.println(-a >> 2); // -192 * 4 = -48 23 24 System.out.println(a >>> 2);// 48 25 System.out.println(-a >>> 2); // 很大的整数 26 27 System.out.println("-----------------------"); 28 a = 64; 29 System.out.println(a >>> 32); 30 System.out.println(a << 32); 31 System.out.println(a >> 32); 32 System.out.println(a >> 33); 33 System.out.println(a >> -31); 34 35 36 } 37} 38 39/* 40192: 41 0000 0000 0000 0000 0000 0000 1100 0000 42<< 2 43 0000 0000 0000 0000 0000 0011 0000 0000 44 45192: 46 0000 0000 0000 0000 0000 0000 1100 0000 47>> 2 48 0000 0000 0000 0000 0000 0000 0011 0000 49 50-192: 51 1111 1111 1111 1111 1111 1111 0100 0000 52>> 2 53 1111 1111 1111 1111 1111 1111 1101 0000 54 55192: 56 0000 0000 0000 0000 0000 0000 1100 0000 57>>> 2 58 0000 0000 0000 0000 0000 0000 0011 0000 59 60-192: 61 1111 1111 1111 1111 1111 1111 0100 0000 62>>> 2 63 0011 1111 1111 1111 1111 1111 1101 0000 64*/
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java中的7个位运算运算符

位运算指的是针对整数的二进制进行的位移操作。位运算提供比算术运算更高的效率,但是位运算的代码可读性较差,建议所有使用位运算的地方写上注释。Java中提供7个位运算符用于位运算。左移(<<)左移运算是将操作数二进制值逐位左移若干位,左移过程中符号位不变,高位溢出则舍弃,低位则补0。范例结果范例结果00000001<<

java 二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题

一.二进制,位运算,移位运算1.二进制对于原码,反码,补码而言,需要注意以下几点:(1).Java中没有无符号数,换言之,Java中的数都是有符号的;(2).二进制的最高位是符号位,0表示正数,1表示负数;(3).正数的原码,反码,补码都一样;(4).负数的反码它的原码符号位不变,其他位取反;(5).

java位运算大全

位运算因为是CPU直接支持的操作指令,也是基于二进制的操作,所以具有相当高的效率,在一些场合,合理应用位运算将具有很高的性能。通常在一些加密算法,图型算法中都会使用到位运算。Java位运算符位 运 算 符 用 来 对 二 进制 位 进 行 操 作 ,Java中提 供 了 如 下所 示 的 位 运 算符:位 运 算 符 (>>,<<

OC中的位运算

转载:https://www.jianshu.com/p/b868b30c0c88OC中的位运算和C/C语言的位运算是一样的。一般有&(按位与),|(按位或),~(按位取反),<<(左移),(右移),^(异或)以及&(按位与然后赋值),|(按位或然后赋值)等对枚举类型的操作中常常会见到。例如定义一个季节SeasonT

FLV文件格式

1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.