Mega Code Archive

 
Categories / Java / Development Class
 

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);     } }