中英文表示
十进制 | 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
// 偶数-二进制的最后一位一定为0
public static boolean check(int m){
return (m&1)==1;
}
//判断m是否为2的x次方
//若m为2的x次方:m的二进制只有最高位为1,其余全为0,(m-1)的二进制除最高位都为1
public static boolean check(int m){
return m&(m-1)==0;
}
特别的要说明思路3,通过移位判断末位是不是1。
import java.util.Scanner;
/*
* 给定一个整数 x,输出该数二进制表示中 1 的个数。
例:9 的二进制表示为 1001,有 2 位是 1 ,所以函数返回 2。
*
*/
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<string.length();i++) {
if(string.charAt(i) =='1') count++;
}
System.out.println(count);
// 3、 通过位运算符
count = 0;
for(int i = 0;i<32;i++) {
if(((n>>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数 {
/*
小赵对进制特别感兴趣,不光研究2进制,3进制, 4进制, 5进制.....
突然有一次,他发现了一个特殊的数2992,这个数,它的十进制数表示,四位数字之和为
2+9+9+2=22,它的十六进制数BB0,
四位数字之和也为22,
同时它的十二进制数表示1894,
四位数字之和也为22,
啊哈,真是巧啊。之后他就去翻书,发现这种数叫天空数。
但是要判断这样的数还是有点麻烦啊,
那么现在请你帮忙来判断任何一个十进制的四位数,不是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) {
// 暴力
// 利用等比数列进行求和
/* 大数的三种定义方法
* BigInteger a = BigInteger.ONE;
* BigInteger a = BigInteger.valueOf(1L);
* BigInteger a = new BigInteger("1");
*/
// 方法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。
}
}