Logic and Integer Arithmetic
/*
* Copyright (c) 1996 Artima Software Company. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for EVALUATION purposes only
* is hereby granted provided that this copyright notice
* appears in all copies. "Evaluation purposes" are any uses which
* do not constitute the sale, sharing, or redistribution of this
* software with or to any other persons in any medium.
*
* ARTIMA SOFTWARE COMPANY MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT
* THE SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. ARTIMA SOFTWARE COMPANY
* SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
* USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*
*/
/*
* ExposedInt.java
*
* This file contains all the code for the signed twos-complement int demo
* applet, named Exposed Int, that accompanies the JavaWorld Under The Hood
* article titled, "Logic and Integer Arithmetic".
*
* Bill Venners, September 1996
*
*/
import java.awt.*;
import java.applet.*;
/**
* An applet that interactively demonstrates the format and behavior
* of signed twos-complement ints in Java.
*
* @author Bill Venners
*
*/
public class ExposedInt extends Applet {
private Label binaryField;
private Label hexField;
private Label decimalField;
private int value;
private GrayButton maximumButton = new GrayButton(ExposedIntStringTable.max);
private GrayButton minimumButton = new GrayButton(ExposedIntStringTable.min);
private GrayButton zeroButton = new GrayButton(ExposedIntStringTable.zero);
public void init() {
Panel buttonPanel = new PanelWithInsets(0, 0, 0, 0);
buttonPanel.setLayout(new GridLayout(3, 2, 5, 5));
buttonPanel.add(new GrayButton(ExposedIntStringTable.increment));
buttonPanel.add(new GrayButton(ExposedIntStringTable.decrement));
buttonPanel.add(minimumButton);
buttonPanel.add(maximumButton);
buttonPanel.add(zeroButton);
buttonPanel.add(new GrayButton(ExposedIntStringTable.negate));
zeroButton.disable();
binaryField = new Label("00000000000000000000000000000000");
hexField = new Label("00000000");
decimalField = new Label("0");
Font fieldFont = new Font("TimesRoman", Font.PLAIN, 12);
binaryField.setFont(fieldFont);
hexField.setFont(fieldFont);
decimalField.setFont(fieldFont);
Panel numberPanel = new Panel();
numberPanel.setBackground(Color.white);
numberPanel.setLayout(new GridLayout(3, 1));
Panel binaryPanel = new Panel();
binaryPanel.setLayout(new BorderLayout());
binaryPanel.add("Center", binaryField);
numberPanel.add(binaryPanel);
Panel hexPanel = new Panel();
hexPanel.setLayout(new BorderLayout());
hexPanel.add("Center", hexField);
numberPanel.add(hexPanel);
numberPanel.add(decimalField);
Panel labelPanel = new Panel();
labelPanel.setBackground(Color.white);
labelPanel.setLayout(new GridLayout(3, 1));
Label label = new Label(ExposedIntStringTable.binary, Label.CENTER);
Font labelFont = new Font("Helvetica", Font.ITALIC, 11);
label.setFont(labelFont);
labelPanel.add(label);
label = new Label(ExposedIntStringTable.hex, Label.CENTER);
label.setFont(labelFont);
labelPanel.add(label);
label = new Label(ExposedIntStringTable.decimal, Label.CENTER);
label.setFont(labelFont);
labelPanel.add(label);
Panel dataPanel = new Panel();
dataPanel.setLayout(new BorderLayout());
dataPanel.add("West", labelPanel);
dataPanel.add("Center", numberPanel);
ColoredLabel title = new ColoredLabel(ExposedIntStringTable.title, Label.CENTER, Color.yellow);
title.setFont(new Font("Helvetica", Font.BOLD, 12));
setBackground(Color.red);
setLayout(new BorderLayout(5, 5));
add("North", title);
add("West", buttonPanel);
add("Center", dataPanel);
}
public boolean action(Event evt, Object arg) {
if (evt.target instanceof Button) {
String bname = (String) arg;
if (bname.equals(ExposedIntStringTable.increment)) {
++value;
}
else if (bname.equals(ExposedIntStringTable.decrement)) {
--value;
}
else if (bname.equals(ExposedIntStringTable.min)) {
value = 0x80000000;
}
else if (bname.equals(ExposedIntStringTable.max)) {
value = 0x7fffffff;
}
else if (bname.equals(ExposedIntStringTable.zero)) {
value = 0;
}
else if (bname.equals(ExposedIntStringTable.negate)) {
value *= -1;
}
UpdateNumberFields();
enableDisableButton(maximumButton, Integer.MAX_VALUE);
enableDisableButton(minimumButton, Integer.MIN_VALUE);
enableDisableButton(zeroButton, 0);
}
return true;
}
void enableDisableButton(Button b, int val) {
if (!b.isEnabled()) {
if (value != val) {
b.enable();
}
} else if (value == val) {
b.disable();
}
}
void UpdateNumberFields() {
decimalField.setText(Integer.toString(value));
int v = value;
StringBuffer buf = new StringBuffer();
for (int i = 0; i < 8; ++i) {
// Get lowest bit
int remainder = v & 0xf;
// Convert bit to a character and insert it into the beginning of the string
switch (remainder) {
case 0:
buf.insert(0, "0");
break;
case 1:
buf.insert(0, "1");
break;
case 2:
buf.insert(0, "2");
break;
case 3:
buf.insert(0, "3");
break;
case 4:
buf.insert(0, "4");
break;
case 5:
buf.insert(0, "5");
break;
case 6:
buf.insert(0, "6");
break;
case 7:
buf.insert(0, "7");
break;
case 8:
buf.insert(0, "8");
break;
case 9:
buf.insert(0, "9");
break;
case 10:
buf.insert(0, "a");
break;
case 11:
buf.insert(0, "b");
break;
case 12:
buf.insert(0, "c");
break;
case 13:
buf.insert(0, "d");
break;
case 14:
buf.insert(0, "e");
break;
case 15:
buf.insert(0, "f");
break;
}
// Shift the int to the right one bit
v >>>= 4;
}
hexField.setText(buf.toString());
v = value;
buf.setLength(0);
for (int i = 0; i < 32; ++i) {
// Get lowest bit
int remainder = v & 0x1;
// Convert bit to a character and insert it into the beginning of the string
if (remainder == 0) {
buf.insert(0, "0");
}
else {
buf.insert(0, "1");
}
// Shift the int to the right one bit
v >>>= 1;
}
binaryField.setText(buf.toString());
}
public Insets insets() {
return new Insets(5, 5, 5, 5);
}
}
class ExposedIntStringTable {
public static final String title = "EXPOSED INT";
public static final String binary = "binary";
public static final String hex = "hex";
public static final String decimal = "decimal";
public static final String max = "Max";
public static final String min = "Min";
public static final String zero = "Zero";
public static final String increment = "++";
public static final String decrement = "--";
public static final String negate = "*=(-1)";
}
// I used this class because I can't seem to set the background color of
// a label. I only want a label, but I want the backgound to be gray.
class ColoredLabel extends Panel {
private Label theLabel;
ColoredLabel(String label, int alignment, Color color) {
setLayout(new GridLayout(1,1));
setBackground(color);
theLabel = new Label(label, alignment);
add(theLabel);
}
public void setLabelText(String s) {
theLabel.setText(s);
}
public Insets insets() {
return new Insets(0, 0, 0, 0);
}
}
class GrayButton extends Button {
GrayButton(String label) {
super(label);
setBackground(Color.lightGray);
}
}
class PanelWithInsets extends Panel {
private int top;
private int left;
private int bottom;
private int right;
PanelWithInsets(int t, int l, int b, int r) {
top = t;
left = l;
bottom = b;
right = r;
}
PanelWithInsets() {
top = 5;
left = 5;
bottom = 5;
right = 5;
}
public Insets insets() {
return new Insets(top, left, bottom, right);
}
}
Related examples in the same category