中英文表示
十进制 | decimal |
八进制 | octal |
十六进制 | hexadecimal |
二进制 | binary |
数字转换(转化成十进制计算)(ai是从字符串的右边开始计位;R是进制数)
应用举例
365(D) = 5 * 10^0 + 6 * 10^1 + 3 * 10 ^2;
1001(B) = 1 * 2^0 + 1 * 2^3 = 9;
二进制:
正数的原码、反码、补码都相同。
计算机中存储负数的补码。
求二进制
计算方法是数字转化的逆思路
比如求11的二进制,依次求2取余,反过来输出
11/2----1
5/2-----1
2/2-----0
1/2-----1
11的二进制编码为1011。
1011(B)= 1*2^0 + 1* 2^1 + 0 + 1*2^3 = 11;
-11的二进制的原码是将1101前面补齐(一共32位)
11的二进制00000000 00000000 00000000 00001101(第一位为符号位,0表示正,1表示负数)
-11的原码:10000000 00000000 00000000 00001101
反码(将-11的原码取反,符号位不变,后面全部取反):11111111 111111111 1111111 11110100
补码(反码加一,计算机中-11二进制存储的是其补码)11111111 111111111 1111111 11110101
Java中得到二进制的几种方法
// 二进制的表示方法 int a = 9;// Integer.toBinaryString(a) System.out.println(Integer.toBinaryString(a));// Integer.toString(a, 2) 注意这个只能用于正数。第二个参数为目标进制 System.out.println(Integer.toString(a, 2));// Integer.parseInt(a, 2) 将字符串a,当前是二进制;转化结果为int类型十进制数字(适用于正数)// BigInteger m = new BigInteger(a,2); 将字符串a用大数处理,a为2进制,默认输出十进制
二进制的相关应用
1、判断奇偶数
2、判断一个数是否为2的次方
// 判断一个奇偶数// 奇数-二进制的最后一位一定为1// 偶数-二进制的最后一位一定为0public static boolean check(int m){return (m&1)==1;}//判断m是否为2的x次方//若m为2的x次方:m的二进制只有最高位为1,其余全为0,(m-1)的二进制除最高位都为1public static boolean check(int m){return m&(m-1)==0;}
统计二进制中1的个数(三种方法)
特别的要说明思路3,通过移位判断末位是不是1。
import java.util.Scanner;public class 二进制中1的个数 { public static void main(String[] args) { Scanner sc= new Scanner(System.in); int n = sc.nextInt(); // 1、 直接使用integer类的方法bitCount(); System.out.println(Integer.bitCount(n)); // 2、使用字符串二进制转化,读取字符1 String string = Integer.toBinaryString(n); int count = 0; for(int i=0;i>i)&1) == 1) count++; } System.out.println(count); }}
天空数?
小赵对进制特别感兴趣,不光研究2进制,3进制, 4进制, 5进制.....
突然有一次,他发现了一个特殊的数2992,这个数,它的十进制数表示,四位数字之和为
2+9+9+2=22,它的十六进制数BB0,
四位数字之和也为22,
同时它的十二进制数表示1894,
四位数字之和也为22,
啊哈,真是巧啊。之后他就去翻书,发现这种数叫天空数。
但是要判断这样的数还是有点麻烦啊,
那么现在请你帮忙来判断任何一个十进制的四位数,不是Sky数吧。
import java.util.Scanner;public class sky数 { //若n为Sky数,则输出“# is a Sky Number.",否则输出“#n is not a Sky Number."。每个结果占-行。注意: #n表示所读入的n值。 public static void main(String[] args) { int a = 0; Scanner sc = new Scanner(System.in); while(sc.hasNext()) { a = sc.nextInt(); if(getRsum(a,10) == getRsum(a,16) && getRsum(a,10) == getRsum(a,12)) { System.out.println(a+ " is a Sky Number."); }else { System.out.println(a+ " is not a Sky Number."); } } } public static int getRsum(int n,int r) { int sum = 0; while(n>0) { sum += n%r; n = n/r; } return sum; }}
集合的子集输出
public class 集合的子集输出 { public static void main(String[] args) { int[] a = {1,2,3,4}; // 元素个数计为n for(int i = 0;i<=15;i++) { // 这里i循环次数是子集个数为2^n = 16 int n = i; int index = 0; System.out.print("{"); while(n>0) { if(n%2 == 1) { if(n>2) System.out.print(a[index]+","); else System.out.print(a[index]); } index++; n=n/2; } System.out.println("}"); } }}
棋盘放麦子
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 1 个棋盘格放 1 粒麦子,在第 2个棋盘格放 2粒麦子,在第 3个棋盘格放 4 粒麦子,在第 4 个棋盘格放 8粒麦子,......后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 64格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
import java.math.BigInteger;public class 棋盘放麦子 { public static void main(String[] args) { // 暴力 // 利用等比数列进行求和 // 方法1: 初始化和sum,变量a是每一项 BigInteger sum = BigInteger.ONE; BigInteger a = BigInteger.valueOf(1L); for(int i=0;i<63;i++) { a = a.multiply(BigInteger.valueOf(2L)); sum = sum.add(a); } System.out.println(sum); // 方法2 利用二进制的方式 StringBuffer s = new StringBuffer(""); for(int i=0;i<64;i++) { // 64位1。 s = s.append("1"); } System.out.println(new BigInteger(s.toString(),2)); // 参数类型分别是string和int。 }}