位运算 进制转换

/**
目的:
移位运算符基本操作:移位运算符的操作数只能是整数型的:char, byte, short, int, long;字符串和浮点型数据不能进行移位操作。
移位运算符:双目运算符,移位位数由第二个操作数决定,下面的操作数指第一个操作数
   >> 右移 正数时:带符号右移操作,高位插入0,低位舍弃;
           负数时:带符号右移操作,高位插入1,低位舍弃;
   >>>  无符号右移操作,高位插入0,低位舍弃
   << 左移 带符号左移操作,低位补0,高位舍弃
   带符号:符号位不变; 无符号:对于负数符号变化;
   在计算机中采用补码表示,下面分割的1个1代表八个1,1个0代表八个0,最高位符号位,总共32位表示
   例子
   x  00 0 0 00010001(17)     11 1 1 11101111(-17)
   x<<2    00 0 0 01000100(68)     11 1 1 10111100(-68)
   x>>2    00 0 0 00000100(4)      11 1 1 11111011(-5)
   x>>>2   00 0 0 00000100(4)      00 1 1 11111011(1073741819)
   在编程时为了便于观察,可以用Integer.toBinaryString(int i) 观察比较结果
按位运算符:
 & 与   有0为0
 | 或   有1为1
 ~ 取反 0-1,1-0
 ^ 抑或 相同为0,相异为1
*/
/**
位操作应用:
十进制转换为2、8、16进制
对于二进制,分别通过 取与循环操作,递归实现 其它进制的转换与此差不多
16进制,采用位运算实现,只要看懂了下面的那个小例子,理解起来很容易,而且位操作更快捷
还有两个函数,一个是自己写的很据传入参数不同,转换十进制
 另一个是java API 中提供的 toBinarySting()方法;
*/
//http://blog.163.com/a_573801550/blog/static/197629116201110109615320/ C语言简单递归实现

/*
fun: transfer Decimal unsignedint to Binary
process: int num
	num % 2
	num = num / 2
*/
class DtoB
{
	final static char[] digits = {
        '0' , '1' , '2' , '3' , '4' , '5' ,
        '6' , '7' , '8' , '9' , 'a' , 'b' ,
        'c' , 'd' , 'e' , 'f'
    };
	/**
	fun: circul implement 取与循环操作  输入数值为非负整数
	@param: n int the specified num conversion
	@return: void
	*/
	public static void dtobC(int n){
		StringBuffer sb = new StringBuffer();
		do
		{
			sb.append(n%2);
			n = n/2;
		}while (n != 0)
		System.out.println(sb.reverse());
	}
	/**
	fun: recursion implement 递归 输入数值为非负整数
	@param: n int the specified num conversion
	@return: void
	*/
	public static void dtobR(int n){
		//way out
		/*if (n > 0)
		{
			dtobR(n/2);
			System.out.print(n%2);
		}*/
		if (n == 0 || n == 1)
		{
			System.out.print(n);
		} else {
			dtobR(n/2);
			System.out.print(n%2);
		}
	}
	/* 十进制转换为十六进制 60 转换为16进制的步骤
	int 在计算机中32位表示,并且是以补码的形式
	   0000-0000  0000-0000  0000-0000  0011-1100    60
	&  0000-0000  0000-0000  0000-0000  0000-1111    15
	=  0000-0000  0000-0000  0000-0000  0000-1100    12 -> C

			0000-0000  0000-0000  0000-0000  0011-1100  num >>> 4
	&  0000-0000  0000-0000  0000-0000  0000-1111 == 15
	=  0000-0000  0000-0000  0000-0000  0000-0011 == 3
	明白了这个下面的就不是问题了
	*/
	public static void dToHex(int num){
		do
		{
			int temp = num & 15;
			if (temp > 9)
			{
				System.out.print((char)(temp - 10 + 'A'));  //ASCII值计算
			} else {
				System.out.print(temp);
			}
			num = num >>> 4;  //计算完低4位后,将数无符号右移四位
		}while (num != 0);
	}
	/**
	十进制转换为2、8、16进制  shift取值1, 3, 4 分别对应2、8、16进制
	*/
	public static void scaleT(int num, int shift){
		StringBuffer sb = new StringBuffer();
		int mask = 1;
		/*for (int si = shift; si > 0; --si)
		{
			mask *= 2;
		}*/
		mask = 1 << shift;  // == 2^shift
		mask--;
		do
		{
			int temp = num & mask;
			if (temp > 9)
			{
				sb.append((char)(temp - 10 + 'A'));
			} else {
				sb.append(temp);
			}
			num = num >>> shift;
		}while (num != 0);
		System.out.println(sb.reverse());  //反序输出
	}
	/**
	fun: Wrapper Classer  转换为二进制 java API中提供的方法
	@param: n int the specified num conversion
	@return: void
	*/
	public static void dtobW(int num){
		//System.out.println(Integer.toBinaryString(num));
		System.out.println(toUnsignedString(num, 1));
	}
	/**
	fun: Conversion of number systems  java包中提供的方法
	@param: i int  the specified num conversion
	@param:	shift int: 1 binary; 
					   3 octonary; 
					   4 hexadicimal
	@return : string
	*/
	private static String toUnsignedString(int i, int shift) {
			char[] buf = new char[32];
			int charPos = 32;
			int radix = 1 << shift;
			int mask = radix - 1;
			do {
				buf[--charPos] = digits[i & mask];
				i >>>= shift;
			} while (i != 0);

			//public String(byte[] bytes, int offset, int length),从buf数组中,取从(32 - charPos)开始的charPos个字符
			return new String(buf, charPos, (32 - charPos));
	}
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值