序、专栏前言
本专栏开启,目的在于帮助大家更好的掌握学习Java
,特别是一些Java学习者
难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。
但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。
学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。
一、【例题1】
1、题目描述
给定一个正整数 n n n 和 k k k ,请问你 n n n 的二进制第 k k k 位是否为
1
(从右往左数)。 ( 1 ≤ n ≤ 2 ) (1 \leq n \leq 2) (1≤n≤2)
2、解题思路
- ( 1 ) (1) (1)
<<
左移运算符,可以将某个数的二进制位整体左移一位,比如0b00010
左移一位后将变为0x00100
。我们知道如果二进制第 x x x 位的值为1
的话,那么它的值是 2 x 2^x 2x,当它左移以后后值将变为 2 x + 1 2^{x+1} 2x+1,所以一个数左移一位后值将乘2
。 - ( 2 ) (2) (2)为了判断 n n n 的第 k k k 位是否为
1
,我们可以将一个1
左移k
位,然后与 n n n 相与一下,如果答案大于0
说明 n n n 的第 k k k 位也为1
。
3、模板代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int k=sc.nextInt();
if ((n&(1<<k))>0) System.out.println("Yes");
else System.out.println("No");
}
}
4、代码解析
- ( 1 ) (1) (1)要注意判断条件是
>0
而不是==1
,因为我们是将1
左移了k
位,它的值是 2 k 2^k 2k,与 n n n相与后如果值大于0
就符合条件。 - ( 2 ) (2) (2)位运算的优先级较低,需要先使用括号括起来。
三、推荐专栏
四、课后习题
序号 | 题目链接 | 难度评级 |
---|---|---|
1 | 二进制表示中质数个计算置位 | 2 |
本文含有隐藏内容,请 开通VIP 后查看