题目链接:https://www.acwing.com/problem/content/91/
参考链接:https://blog.csdn.net/chaiwenjun000/article/details/71154235
https://blog.csdn.net/qq_30076791/article/details/50571194
https://blog.csdn.net/riba2534/article/details/79834558
- 判断一个数字x二进制下第i位是不是等于1。
方法:if ( ( ( 1 << ( i - 1 ) ) & x ) > 0)
将1左移i-1位,相当于制造了一个只有第i位上是1,其他位上都是0的二进制数。然后与x做与运算,如果结果>0,说明x第i位上是1,反之则是0。
-
将一个数字x二进制下第i位更改成1。
方法:x = x | ( 1<<(i-1) )
证明方法与1类似,此处不再重复证明。
-
把一个数字二进制下最靠右的第一个1去掉。
方法:x=x&(x-1)
- 二进制中子集的个数以及每个子集的具体内容
比如有5个小球,如果每个小球都被选中的话,这可以用二进制11111来表示。依此类推如果都没有被选中,则是00000。那么求出这5个小球被选中的所有可能状态,用二进制表示。
public class Main { public static void main(String[] args) { int x= (int) (Math.pow(2,5)-1);//表示5个小球都被选中的状态11111:十进制表示为2^5-1 int n=0; for(int i=x;i!=0;){ i=(i-1)&x; n++; System.out.println(Integer.toBinaryString(i));//每个子集的具体内容 } System.out.println("n=="+n);//子集个数 } }
- 判断一个数是不是偶数
只需判断最后一位是1还是0。最后一位是1,说明是奇数。最后一位是0,说明是偶数。因为只有2的0次方才是奇数值1,其他的2的k(k = 1,2,….)都是偶数
public class Main { public static void main(String[] args) { int a=4; if((a & 1)!=0) System.out.println( "是奇数" ); else System.out.println( "是偶数" ); } }
快速幂
快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高
以下以求a的b次方来介绍
把b转换成二进制数。
该二进制数第i位的权为
例如
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
以上是初中公式,翻一下书就知道。
public static void main(String[] args) { int a=3;//底数 int b=4;//指数 int res=1;//结果 while (b!=0){ if((b&1)!=0)//只有二进制不为0 res*=a; a=a*a; b=b>>1; } System.out.println(res); }
a^b%mod解答
数学定理:某两个正整数的积与某正整数相除得到的余数同这两个数分别除以该数所得的余数的积相等
static long solve(long a, long b,long p) { long ans = 1; long base = a; if (b==0) { return 1%p; } while (b != 0) { if ((b & 1) != 0) { ans *= base;// 该位为1,应该乘对应基数; ans%=p; } base = base * base%p;// 基数更新; b = b >> 1;// 同b/=2; } return ans; }