I have written a program for a user-defined binary data type in JAVA. It has
static methods for purposeful usage
methods for binary arithmetic
methods for bitwise operations
It's working as intended, but I feel the code is a bit too verbose. Any suggestions on how to shorten it? Also, can I make it faster? Beyond that, were any noob errors of exception cases meant. P.S. You will see that I defined my own methods for bitwise operations instead of the standard JAVA bitwise operators. I did it just to get the hang of programming.
import java.lang.*;
import java.util.*;
class Binary
{
public final int binary;
public final int decimal;
public static int fromBintoDec(int b)
{
int fv, d = 0, p2 = 1;
while
(b != 0)
{
fv = (b % 10);
d += (fv * p2);
b /= 10;
p2 *= 2;
}
return d;
}
public static int fromDectoBin(int d)
{
String bs = "", sd; int mv;
while
(d != 0)
{
mv = (d % 2);
sd = Integer.toString(mv);
bs = (sd + bs);
d /= 2;
}
int b = Integer.parseInt(bs);
return b;
}
public static int howManyDigits(int x)
{
int nd = 0;
while
(x != 0)
{
x /= 10;
nd += 1;
}
return nd;
}
public static String[] readyBitwise(int x, int y)
{
int ndg = howManyDigits(Math.max(x, y));
int ndl = howManyDigits(Math.min(x, y));
int nzd = ndg - ndl;
String zd = "";
String xs = Integer.toString(x);
String ys = Integer.toString(y);
for
(int i = 1; i <= nzd; i++)
{
zd += '0';
}
if
(x > y)
{
ys = zd + ys;
}
else
{
xs = zd + xs;
}
String[] fa = new String[2];
fa[0] = xs;
fa[1] = ys;
return fa;
}
public static int[] toBitArray(String x)
{
int l = x.length();
int[] xba = new int[l];
for
(int i = 0; i < l; i++)
{
xba[i] = (Integer.parseInt((Character.toString(x.charAt(i)))));
}
return xba;
}
public static int toBinary(int[] xa)
{
int s = xa.length;
String xsb = ""; int xb;
for
(int i = 0; i < s; i++)
{
String d = Integer.toString(xa[i]);
xsb += d;
}
xb = Integer.parseInt(xsb);
return xb;
}
public Binary(int bi)
{
binary = bi;
decimal = (fromBintoDec(bi));
}
public String toString()
{
String bsv = Integer.toString(binary);
return bsv;
}
public int toDecimal()
{
Binary x = this;
return (x.decimal);
}
public Binary plus(Binary y)
{
Binary x = this;
int ds = x.decimal + y.decimal;
int bs = fromDectoBin(ds);
Binary s = new Binary(bs);
return s;
}
public Binary minus(Binary y)
{
Binary x = this;
int dd = Math.abs((x.decimal - y.decimal));
int bd = fromDectoBin(dd);
Binary d = new Binary(bd);
return d;
}
public Binary times(Binary y)
{
Binary x = this;
int dp = x.decimal * y.decimal;
int bp = fromDectoBin(dp);
Binary p = new Binary(bp);
return p;
}
public Binary by(Binary y)
{
Binary x = this;
int dq = x.decimal / y.decimal;
int bq = fromDectoBin(dq);
Binary q = new Binary(bq);
return q;
}
public Binary mod(Binary y)
{
Binary x = this;
int dq = x.decimal % y.decimal;
int bq = fromDectoBin(dq);
Binary q = new Binary(bq);
return q;
}
public Binary or(Binary y)
{
Binary x = this;
int xb = x.binary;
int yb = y.binary;
String xsb = (readyBitwise(xb, yb))[0];
String ysb = (readyBitwise(xb, yb))[1];
int[] xba = toBitArray(xsb);
int[] yba = toBitArray(ysb);
int s = xba.length;
int[] fa = new int[s];
int xd, yd;
for
(int i = 0; i < s; i++)
{
xd = xba[i];
yd = yba[i];
if
((xd == 0) && (yd == 0))
{
fa[i] = 0;
}
else if
((xd == 1) && (yd == 0))
{
fa[i] = 1;
}
else if
((xd == 0) && (yd == 1))
{
fa[i] = 1;
}
else if
((xd == 1) && (yd == 1))
{
fa[i] = 1;
}
else
{
i += 0;
}
}
int ob = toBinary(fa);
return (new Binary(ob));
}
public Binary and(Binary y)
{
Binary x = this;
int xb = x.binary;
int yb = y.binary;
String xsb = (readyBitwise(xb, yb))[0];
String ysb = (readyBitwise(xb, yb))[1];
int[] xba = toBitArray(xsb);
int[] yba = toBitArray(ysb);
int s = xba.length;
int[] fa = new int[s];
int xd, yd;
for
(int i = 0; i < s; i++)
{
xd = xba[i];
yd = yba[i];
if
((xd == 0) && (yd == 0))
{
fa[i] = 0;
}
else if
((xd == 1) && (yd == 0))
{
fa[i] = 0;
}
else if
((xd == 0) && (yd == 1))
{
fa[i] = 0;
}
else if
((xd == 1) && (yd == 1))
{
fa[i] = 1;
}
else
{
i += 0;
}
}
int ab = toBinary(fa);
return (new Binary(ab));
}
public Binary xor(Binary y)
{
Binary x = this;
int xb = x.binary;
int yb = y.binary;
String xsb = (readyBitwise(xb, yb))[0];
String ysb = (readyBitwise(xb, yb))[1];
int[] xba = toBitArray(xsb);
int[] yba = toBitArray(ysb);
int s = xba.length;
int[] fa = new int[s];
int xd, yd;
for
(int i = 0; i < s; i++)
{
xd = xba[i];
yd = yba[i];
if
((xd == 0) && (yd == 0))
{
fa[i] = 0;
}
else if
((xd == 1) && (yd == 0))
{
fa[i] = 1;
}
else if
((xd == 0) && (yd == 1))
{
fa[i] = 1;
}
else if
((xd == 1) && (yd == 1))
{
fa[i] = 0;
}
else
{
i += 0;
}
}
xb = toBinary(fa);
return (new Binary(xb));
}
public Binary not()
{
Binary x = this;
String xb = Integer.toString(x.binary);
int[] xba = toBitArray(xb);
int s = xba.length;
int[] fa = new int[s];
int xd;
for
(int i = 0; i < s; i++)
{
xd = xba[i];
if
((xd == 0))
{
fa[i] = 1;
}
else if
((xd == 1))
{
fa[i] = 0;
}
else
{
i += 0;
}
}
int xbi = toBinary(fa);
return (new Binary(xbi));
}
public static void Test()
{
Binary a = new Binary(1100);
Binary b = new Binary(101);
System.out.println(a.plus(b));
System.out.println(a.minus(b));
System.out.println(a.times(b));
System.out.println(a.by(b));
System.out.println(a.or(b));
System.out.println(a.and(b));
System.out.println(a.xor(b));
System.out.println(b.not());
}
}
int
toint
. That's very much not what I'd expect... \$\endgroup\$public static int fromBintoDec(int b)
I have used for an internal operation (conversion of the binary value entered to decimal for usage in arithmetic operations. I am defining a new data type so I cannot return a Binary and work with it without defining my work methods. \$\endgroup\$