位运算 进制转换
2013-08-03 16:29
176 查看
/**
目的:
移位运算符基本操作:移位运算符的操作数只能是整数型的: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语言简单递归实现
目的:
移位运算符基本操作:移位运算符的操作数只能是整数型的: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)); } }
相关文章推荐
- 数学运算高级工具bc:小数精度;进制转换;计算平方及平方根
- JAVA移位运算与进制转换
- 进制转换与Java的位运算操作
- C位运算分析及进制转换
- LeetCode 405. Convert a Number to Hexadecimal (进制转换,移位运算)
- 进制转换、位运算、逻辑运算
- 利用移位运算实现进制转换
- 【转 】shell 运算和进制转换
- shell命令-bc(数学运算/进制转换)
- Java 进制转换、位运算、逻辑运算
- C++ 移位运算与进制转换 浅析
- java实现多功能科学计算器(包括进制转换,三角函数,四则运算等)
- js的大数运算 跟经典的收藏 结合前一篇的收藏 解决工作中的一个大数进制转换问题
- 基础 Linux 命令用法 - 使用 bc 进行简单运算与进制转换
- MKL的矩阵运算
- 线性表的应用——一元多项式的代数运算
- 黑马程序员--C语言基础--基本运算
- c++实现对每一行输入的数据的运算
- 定点乘法运算之原码一位乘法
- 大数运算的算法