二进制相关问题

中英文表示

十进制

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;
}

 统计二进制中1的个数(三种方法)

特别的要说明思路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。
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值