复习笔记1 进制以及进制转换

本文探讨了Java中不同进制数的表示方法、负数的有符号位移与无符号位移的区别、整数的无符号进制转换、正负数的相互转换以及特殊字符的整数表示。通过实例代码解释了整数与字符之间的转换方法,包括自减操作的实现、减法的替代方式以及字符的进制表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.IOException;

public class Test2
{
	public static void main(String[] args) throws IOException
	{
	
		// java 中 10 8 16进制常数的写法
		System.out.println(512);
		System.out.println(01000);
		System.out.println(0x200);
		System.out.println("=========================================>");
		
		// 对于负数有符号位移和无符号位移有差别
		// 有符号位移会自动高位补1,无符号将补0,
		// 也就是说-1有符号右移1位为-1,无符号右移1位为integer最大值
		System.out.println((-1 >> 1) == (-1 >>> 1));
		System.out.println("=========================================>");
		
		// 打印src的 2 4 8 16 32进制
		int src = -5;
		System.out.println(toUnsignedString(src, 1));
		System.out.println(toUnsignedString(src, 2));
		System.out.println(toUnsignedString(src, 3));
		System.out.println(toUnsignedString(src, 4));
		System.out.println(toUnsignedString(src, 5));
		System.out.println("=========================================>");
		
		//正负数转换的方法
		src = -100;
		System.out.println(-src);
		System.out.println(conversion(src));
		System.out.println("=========================================>");
		
		//char 可以参加运算实际上是由于他存储的是整数
		//而由于char是无符号的,所以需要17位来表示,
		//所以才会看起来像int
		System.out.println('㮆');
		System.out.println(((char)-50298));
		System.out.println("=========================================>");
		
		//减减的实现方式
		//由于计算机不存在减法,减法也是用加法算的
		//所以一个整数加上这个整数类型的无符号最大值
		//就相当于是自减,有符号的看起来像是加了一个
		//-1,但计算机并没有负数的概念
		int x = 355;
		System.out.println(--x);
		System.out.println((((x + 255) & 0xff) + (0xffffff00 & x)));
		System.out.println(x + 0xffffffff);
		System.out.println("=========================================>");
		
		
		
	}
	
	public final static char[] digits =
	{
	        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c',
	        'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
	        'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
	};
	
	/**
	 * 无符号进制转换
	 * 
	 * <p>
	 * 每次取出传入 i 的最后 shift 位,并将该值转化为10进制的值进行查表<br>
	 * 最后以倒叙的型式组成字符串
	 * 
	 * @param i 需要转换的整数
	 * @param shift 表示偏移量,1为2进制,2为4进制,3为8进制,4为16进制, 5为32进制
	 * @return 表示该进制型式的字符串
	 */
	public static String toUnsignedString(int i, final/*此处final仅在编译期有效*/ int shift)
	{
	
		// 该字符数组用来保存每一位的字符表现型式
		char[] buf = new char[32];
		// 字符指针,表示转换后的第几位
		int charPos = 32;
		// 基数,表示该进制逢多少进1
		int radix = 1 << shift;
		// 掩码,表示该进制中的最大数的2进制型式
		int mask = radix - 1;
		
		// 以倒序的型式换算
		//每次取shift表示的进制的位数
		//并将该值转化为相应的进制型式字符
		do
		{
			//假设该次为转换成2进制,那么每位最大值为1
			//即mask为1,以i & mask 的结果就为 0 和 1
			//所以在buf中,根据表digits只能有0和1的字符
			buf[--charPos] = digits[i & mask];
			i >>>= shift;
		}
		while (i != 0);
		
		return new String(buf, charPos, (32 - charPos));
	}
	
	/**
	 * 正负数转换
	 * @param i 需要转换的数
	 * @return i 的相对数
	 */
	public static int conversion(int i)
	{
		return ~i + 1;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值