长沙网站推广公司哪家好,手机软件怎么做出来的,tk网站的dns修改,网站后台添加编辑器目录 1.判断一个数是2的次方数
2.统计一个数#xff0c;它的二进制数中#xff0c;1的个数
3.在2*#xff08;n-1#xff09;个数中#xff0c;找到只出现一次的那个数 1.判断一个数是2的次方数
这个问题有好几种做法#xff0c;但是最优雅的解法是用’位运算‘来做。…目录 1.判断一个数是2的次方数
2.统计一个数它的二进制数中1的个数
3.在2*n-1个数中找到只出现一次的那个数 1.判断一个数是2的次方数
这个问题有好几种做法但是最优雅的解法是用’位运算‘来做。
总所周知一个2的次方数其二进制必定是100....000将其减1就是0111....111两者进行与
运算必定是0。
即a(a-1)0
代码如下
public class 二的次方数 {public static void main(String[] args) {Scanner scnew Scanner(System.in);while (sc.hasNext()) {int a sc.nextInt();if ((a (a - 1)) 0) {System.out.println(是2的次方数);} else {System.out.println(不是2的次方数);}}}
} 2.统计一个数它的二进制数中1的个数
这个问题也有很多思路但是在这里我们用位运算来做还是用这个a(a-1)来做这个式子
有什么作用呢
它就是把这个数的二进制数最右边的1置0
举个例子
1.末尾为1
a: 000001
a-1: 000000
相与后为000000
2.末尾不为0
a: 001100
a-1: 001011
相与后为 001000
看见没就是把最右边的1置0只要它不等于0继续进行这样的操作即可就能统计出1的个
数
代码
public class 二进制中1的个数 {public static void main(String[] args) {Scanner sc new Scanner(System.in);while (sc.hasNext()) {int a sc.nextInt();int count 0;while (a 0) {a a (a - 1);count;}System.out.println(count);}}
}3.在2*n-1个数中找到只出现一次的那个数 这里我们使用异或运算使用常规方法会出现很多问题。
因为
x^x0 相同异或为0
x^0x 与0异或 为原数
若测试数据为1 2 3 2 3 4 4
按照交换律2 2 3 3 4 4 1
前面相同的都异或为0再与1异或为1
代码
public class 查找只出现一次的数 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n 0;int ans 0;//记录结果int a0;//每次读入的数while (sc.hasNext()) {ans0;//每一次测试将结果置0n sc.nextInt();for (int i 0; i 2 * n - 1; i) {asc.nextInt();ansans^a;}System.out.println(ans);}}
}