黑马程序员技术交流社区
标题:
前段时间写了个进制转换的小程序,发上来大家一起研究...
[打印本页]
作者:
范俊
时间:
2012-7-4 19:57
标题:
前段时间写了个进制转换的小程序,发上来大家一起研究...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class JZChange extends JFrame implements ActionListener,MouseListener{
<FONT color=red>……省略组件的定义
</FONT>
/*
*进制转换具体实现方法
*/
//1、二进制转八进制
public static String binToOct(String s){ //先将二进制转化为十进制存储,再进行位运算
int data = 0; //临时数据,初始化为0
for(int i=0;i<s.length();i++){ //循环位移再或,初始化为0,将数据左移一位再或运算
data = (s.charAt(i)-'0')|(data<<1);
}
s = "";
while(true){
int tmp = data & 7; //与7进行与运算
System.out.println(tmp);
s = tmp + s;
data >>= 3; //右移三位
if(data == 0)
break;
}
return s;
}
public static String binToDec(String s){ //2、二进制转十进制
int data = 0; //临时数据,初始化为0
for(int i=0;i<s.length();i++){ //循环位移再或,初始化为0,将数据左移一位再或运算
data = (s.charAt(i)-'0')|(data<<1);
}
s = Integer.toString(data); //将数字再转化为字符串
return s;
}
public static String binToHex(String s){ //3、二进制转十六进制
int data = 0; //临时数据,初始化为0
for(int i=0;i<s.length();i++){ //循环位移再或,初始化为0,将数据左移一位再或运算
data = (s.charAt(i)-'0')|(data<<1);
}
s = "";
while(true){
int tmp = data & 15; //与15进行与运算
if(tmp >= 10){
char tmpChar = (char)((char)tmp + '7');
s = tmpChar + s;
}else
s = tmp + s;
data >>= 4; //右移四位
if(data == 0)
break;
}
return s;
}
public static String octToBin(String s){ //4、八进制转二进制
int data = 0; //临时数据,初始化为0
for(int i=0;i<s.length();i++){ //循环位移再或,初始化为0,将数据左移三位再或运算
data = (s.charAt(i)-'0')|(data<<3);
}
s = "";
while(true){
int tmp = data & 1; //与1做与运算
s = tmp + s;
data >>= 1; //右移一位
if(data == 0) //判断原始数据是否为0
break;
}
return s;
}
public static String octToDec(String s){ //5、八进制转十进制
int data = 0; //临时数据,初始化为0
for(int i=0;i<s.length();i++){ //循环位移再或,初始化为0,将数据左移三位再或运算
data = (s.charAt(i)-'0')|(data<<3);
}
s = Integer.toString(data);
return s;
}
public static String octToHex(String s){ //6、八进制转十六进制
int data = 0; //临时数据,初始化为0
for(int i=0;i<s.length();i++){ //循环位移再或,初始化为0,将数据左移三位再或运算
data = (s.charAt(i)-'0')|(data<<3);
}
s = "";
while(true){
int tmp = data & 15; //与15做与运算
if(tmp >= 10){
char tmpChar = (char)((char)tmp + '7');
s = tmpChar + s;
}else
s = tmp + s;
data >>= 4; //右移四位
if(data == 0) //判断原始数据是否为0
break;
}
return s;
}
public static String decToBin(String s){ //7、十进制转二进制
int data = 0;
data = Integer.parseInt(s);
s = "";
while(true){
int tmp = data & 1; //与1做与运算
s = tmp + s;
data >>= 1; //右移一位
if(data == 0) //判断原始数据是否为0
break;
}
return s;
}
public static String decToOct(String s){ //8、十进制转八进制
int data = 0;
data = Integer.parseInt(s);
s = "";
while(true){
int tmp = data & 7; //与7做与运算
s = tmp + s;
data >>= 3; //右移三位
if(data == 0) //判断原始数据是否为0
break;
}
return s;
}
public static String decToHex(String s){ //9、十进制转十六进制
int data = 0;
data = Integer.parseInt(s);
s = "";
while(true){
int tmp = data & 15; //与15进行与运算
if(tmp >= 10){
char tmpChar = (char)((char)tmp + '7');
s = tmpChar + s;
}else
s = tmp + s;
data >>= 4; //右移四位
if(data == 0)
break;
}
return s;
}
public static String hexToBin(String s){ //10、十六进制转二进制
int data = 0; //临时数据,初始化为0
for(int i=0;i<s.length();i++){ //循环位移再或,初始化为0,将数据左移四位再或运算
char tmpChar = s.charAt(i);
if(tmpChar >= 'A')
data = (s.charAt(i)-'7')|(data<<4);
else
data = (s.charAt(i)-'0')|(data<<4);
}
s = "";
while(true){
int tmp = data & 1; //与1做与运算
s = tmp + s;
data >>= 1; //右移一位
if(data == 0) //判断原始数据是否为0
break;
}
return s;
}
public static String hexToOct(String s){ //11、十六进制转八进制
int data = 0; //临时数据,初始化为0
for(int i=0;i<s.length();i++){ //循环位移再或,初始化为0,将数据左移四位再或运算
char tmpChar = s.charAt(i);
if(tmpChar >= 'A')
data = (s.charAt(i)-'7')|(data<<4);
else
data = (s.charAt(i)-'0')|(data<<4);
}
s = "";
while(true){
int tmp = data & 7; //与7做与运算
s = tmp + s;
data >>= 3; //右移三位
if(data == 0) //判断原始数据是否为0
break;
}
return s;
}
public static String hexToDec(String s){ //12、十六进制转十进制
int data = 0; //临时数据,初始化为0
for(int i=0;i<s.length();i++){ //循环位移再或,初始化为0,将数据左移四位再或运算
char tmpChar = s.charAt(i);
if(tmpChar >= 'A')
data = (s.charAt(i)-'7')|(data<<4);
else
data = (s.charAt(i)-'0')|(data<<4);
}
s = Integer.toString(data);
return s;
}
public void actionPerformed(ActionEvent e) {
//点击二进制按钮
if(e.getSource() == jRB_2){
jRB_2.setSelected(true);
jRB_8.setSelected(false);
jRB_10.setSelected(false);
jRB_16.setSelected(false);
for(int i = 0;i < 2;i++){
jButtons[i].setEnabled(true);
}
for(int i = 2;i < 16;i++){
jButtons[i].setEnabled(false);
}
jTextField.setText("");
switch(curFlag){
case 8:
if(displayStr != "")
displayStr = this.octToBin(displayStr);
break;
case 10:
if(displayStr != "")
displayStr = this.decToBin(displayStr);
break;
case 16:
if(displayStr != "")
displayStr = this.hexToBin(displayStr);
break;
default:
break;
}
curFlag = 2;
jTextField.setText(displayStr);
}
//点击八进制按钮
if(e.getSource() == jRB_8){
jRB_2.setSelected(false);
jRB_8.setSelected(true);
jRB_10.setSelected(false);
jRB_16.setSelected(false);
for(int i = 0;i < 8;i++){
jButtons[i].setEnabled(true);
}
for(int i = 8;i < 16;i++){
jButtons[i].setEnabled(false);
}
jTextField.setText("");
switch(curFlag){
case 2:
if(displayStr != "")
displayStr = this.binToOct(displayStr);
break;
case 10:
if(displayStr != "")
displayStr = this.decToOct(displayStr);
break;
case 16:
if(displayStr != "")
displayStr = this.hexToOct(displayStr);
break;
default:
break;
}
curFlag = 8;
jTextField.setText(displayStr);
}
//点击十进制按钮
if(e.getSource() == jRB_10){
jRB_2.setSelected(false);
jRB_8.setSelected(false);
jRB_10.setSelected(true);
jRB_16.setSelected(false);
for(int i = 0;i < 10;i++){
jButtons[i].setEnabled(true);
}
for(int i = 10;i < 16;i++){
jButtons[i].setEnabled(false);
}
jTextField.setText("");
switch(curFlag){
case 2:
if(displayStr != ""){
displayStr = this.binToDec(displayStr);
}
break;
case 8:
if(displayStr != ""){
displayStr = this.octToDec(displayStr);
}
break;
case 16:
if(displayStr != ""){
displayStr = this.hexToDec(displayStr);
}
break;
default:
break;
}
curFlag = 10;
jTextField.setText(displayStr);
}
//点击十六进制按钮
if(e.getSource() == jRB_16){
jRB_2.setSelected(false);
jRB_8.setSelected(false);
jRB_10.setSelected(false);
jRB_16.setSelected(true);
for(int i = 0;i < 16;i++){
jButtons[i].setEnabled(true);
}
jTextField.setText("");
switch(curFlag){
case 2:
if(displayStr != ""){
displayStr = this.binToHex(displayStr);
}
break;
case 8:
if(displayStr != ""){
displayStr = this.octToHex(displayStr);
}
break;
case 10:
if(displayStr != ""){
displayStr = this.decToHex(displayStr);
}
break;
default:
break;
}
curFlag = 16;
jTextField.setText(displayStr);
}
}
public void mouseClicked(MouseEvent e){
for(int i=0;i<16;i++){
if(e.getSource() == jButtons[i]){
if(jButtons[i].isEnabled() == true){ //判断按钮是否已经启用
if(i>=0&&i<10){
displayStr = displayStr + i;
System.out.println("点击了按钮"+i);
}else{
char tmp = (char)(i+55);
displayStr = displayStr + tmp;
System.out.println("点击了按钮"+tmp);
}
}
jTextField.setText(displayStr);
}
}
if(e.getSource() == jb_clear){
System.out.println("点击了按钮清空");
displayStr = "";
jTextField.setText("");
}
if(e.getSource() == jb_delete){
System.out.println("点击了按钮删减");
int length = displayStr.length();
if(length > 1){
displayStr = displayStr.substring(0,displayStr.length()-1);
}else
displayStr = "";
jTextField.setText(displayStr);
}
}
<FONT color=red>…………省略空函数
</FONT>
public static void main(String[] args){
JZChange jzChange = new JZChange();
}
}
程序存在BUG,当数据存储达到32bit,就会出现问题,比如十六进制转二进制,输入AB234545,再点击二进制,程序就卡住了,百思不得其解,难道跟符号位有关?
复制代码
作者:
范俊
时间:
2012-7-4 19:58
组件的定义:
private JRadioButton jRB_2,jRB_8,jRB_10,jRB_16; //进制转换单选按钮
private JTextField jTextField; //显示文本框
private JPanel jPanel1,jPanel2;
private JButton[] jButtons;
private JButton jb_delete,jb_clear;
private static int curFlag = 0; //标识当前进制,取值为2、8、10、16,初始化为0
private static String displayStr = "";
public JZChange(){
//设置标题
super("进制转换器");
//初始化面板
jRB_2 = new JRadioButton("二进制"); //二进制单选按钮
jRB_2.setFont(new Font("宋体",Font.PLAIN,12));
jRB_8 = new JRadioButton("八进制"); //八进制单选按钮
jRB_8.setFont(new Font("宋体",Font.PLAIN,12));
jRB_10 = new JRadioButton("十进制"); //十进制单选按钮
jRB_10.setFont(new Font("宋体",Font.PLAIN,12));
jRB_16 = new JRadioButton("十六进制"); //十六进制单选按钮
jRB_16.setFont(new Font("宋体",Font.PLAIN,12));
jb_delete = new JButton("删减");
jb_delete.setFont(new Font("宋体",Font.PLAIN,12));
jb_clear = new JButton("清空");
jb_clear.setFont(new Font("宋体",Font.PLAIN,12));
jPanel1 = new JPanel(new GridLayout(3,2));
jPanel1.add(jRB_2);
jRB_2.addActionListener(this);
jPanel1.add(jRB_8);
jRB_8.addActionListener(this);
jPanel1.add(jRB_10);
jRB_10.addActionListener(this);
jPanel1.add(jRB_16);
jRB_16.addActionListener(this);
jPanel1.add(jb_clear);
jb_clear.addMouseListener(this);
jPanel1.add(jb_delete);
jb_delete.addMouseListener(this);
jTextField = new JTextField();
jTextField.setEditable(false);
//jTextField.setFont(new Font("新宋体",Font.BOLD,17));
jPanel2 = new JPanel(new GridLayout(4,4));
jButtons = new JButton[16];
//初始化0-9的数字按钮
for(int i = 0;i < 10;i++){
String digitStr = "";
digitStr = digitStr+i;
//System.out.println(digitStr);
jButtons[i] = new JButton(digitStr);
}
//初始化A-Z的字母按钮
for(int i = 10;i < 16;i++){
String letterStr = "";
char letter = (char)(i+55);
letterStr = letterStr+letter;
//System.out.println(letterStr);
jButtons[i] = new JButton(letterStr);
}
//添加按钮
for(int i = 0;i < 16;i++){
jPanel2.add(jButtons[i]);
jButtons[i].addMouseListener(this);
}
this.add(jTextField,BorderLayout.NORTH);
this.add(jPanel1,BorderLayout.CENTER);
this.add(jPanel2,BorderLayout.SOUTH);
//初始化按钮状态
for(int i = 0;i < 16;i++){
jButtons[i].setEnabled(false);
}
this.setSize(250,250);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
复制代码
作者:
范俊
时间:
2012-7-4 19:58
空函数:
public void mousePressed(MouseEvent e){
}
public void mouseReleased(MouseEvent e){
}
public void mouseEntered(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
复制代码
作者:
范俊
时间:
2012-7-4 20:00
程序存在BUG,当数据存储达到32bit,就会出现问题,比如十六进制转二进制,输入AB234545,再点击二进制,程序就卡住了,百思不得其解,难道跟符号位有关?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2