mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-06-22 18:55:38 +00:00
trunk contents moved to root
This commit is contained in:
250
libsrc/avi/src/org/monte/media/math/IntMath.java
Normal file
250
libsrc/avi/src/org/monte/media/math/IntMath.java
Normal file
@@ -0,0 +1,250 @@
|
||||
/*
|
||||
* @(#)IntMath.java
|
||||
*
|
||||
* Copyright (c) 2002-2012 Werner Randelshofer, Goldau, Switzerland.
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may not use, copy or modify this file, except in compliance with the
|
||||
* license agreement you entered into with Werner Randelshofer.
|
||||
* For details see accompanying license terms.
|
||||
*/
|
||||
|
||||
package org.monte.media.math;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* Utility class for integer arithmetic.
|
||||
*
|
||||
* @author Werner Randelshofer
|
||||
* @version $Id: IntMath.java 299 2013-01-03 07:40:18Z werner $
|
||||
*/
|
||||
public class IntMath {
|
||||
|
||||
/** Creates a new instance of IntMath */
|
||||
public IntMath() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an int whose value is the greatest common divisor of
|
||||
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
||||
* <tt>a==0 && b==0</tt>.
|
||||
*
|
||||
* @param a value with with the GCD is to be computed.
|
||||
* @param b value with with the GCD is to be computed.
|
||||
* @return <tt>GCD(a, b)</tt>
|
||||
*/
|
||||
public static int gcd(int a, int b) {
|
||||
// Quelle:
|
||||
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
||||
// Bonn, München Paris: Addison Wesley.
|
||||
// ggt6, Seite 63
|
||||
|
||||
a = Math.abs(a);
|
||||
b = Math.abs(b);
|
||||
|
||||
while (a > 0 && b > 0) {
|
||||
a = a % b;
|
||||
if (a > 0) b = b % a;
|
||||
}
|
||||
return a + b;
|
||||
}
|
||||
/**
|
||||
* Returns a long whose value is the greatest common divisor of
|
||||
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
||||
* <tt>a==0 && b==0</tt>.
|
||||
*
|
||||
* @param a value with with the GCD is to be computed.
|
||||
* @param b value with with the GCD is to be computed.
|
||||
* @return <tt>GCD(a, b)</tt>
|
||||
*/
|
||||
public static long gcd(long a, long b) {
|
||||
// Quelle:
|
||||
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
||||
// Bonn, München Paris: Addison Wesley.
|
||||
// ggt6, Seite 63
|
||||
|
||||
a = Math.abs(a);
|
||||
b = Math.abs(b);
|
||||
|
||||
while (a > 0 && b > 0) {
|
||||
a = a % b;
|
||||
if (a > 0) b = b % a;
|
||||
}
|
||||
return a + b;
|
||||
}
|
||||
/**
|
||||
* Returns a long whose value is the greatest common divisor of
|
||||
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
||||
* <tt>a==0 && b==0</tt>.
|
||||
*
|
||||
* @param a value with with the GCD is to be computed.
|
||||
* @param b value with with the GCD is to be computed.
|
||||
* @return <tt>GCD(a, b)</tt>
|
||||
*/
|
||||
public static BigInteger gcd(BigInteger a, BigInteger b) {
|
||||
// Quelle:
|
||||
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
||||
// Bonn, München Paris: Addison Wesley.
|
||||
// ggt6, Seite 63
|
||||
|
||||
a = a.abs();
|
||||
b = b.abs();
|
||||
|
||||
while (a.compareTo(BigInteger.ZERO) > 0 && b.compareTo(BigInteger.ZERO) > 0) {
|
||||
a = a.mod(b);
|
||||
if (a.compareTo(BigInteger.ZERO) > 0) b = b.mod(a);
|
||||
}
|
||||
return a.add(b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an int whose value is the smallest common multiple of
|
||||
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
||||
* <tt>a==0 || b==0</tt>.
|
||||
*
|
||||
* @param a value with with the SCM is to be computed.
|
||||
* @param b value with with the SCM is to be computed.
|
||||
* @return <tt>SCM(a, b)</tt>
|
||||
*/
|
||||
public static int scm(int a, int b) {
|
||||
// Quelle:
|
||||
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
||||
// Bonn, München Paris: Addison Wesley.
|
||||
// gill, Seite 141
|
||||
|
||||
if (a == 0 || b == 0) return 0;
|
||||
|
||||
a = Math.abs(a);
|
||||
b = Math.abs(b);
|
||||
|
||||
int u = a;
|
||||
int v = b;
|
||||
|
||||
while (a != b) {
|
||||
if (a < b) {
|
||||
b -= a;
|
||||
v += u;
|
||||
} else {
|
||||
a -= b;
|
||||
u += v;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//return a; // gcd
|
||||
return (u + v) / 2; // scm
|
||||
}
|
||||
/**
|
||||
* Returns an int whose value is the smallest common multiple of
|
||||
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
||||
* <tt>a==0 || b==0</tt>.
|
||||
*
|
||||
* @param a value with with the SCM is to be computed.
|
||||
* @param b value with with the SCM is to be computed.
|
||||
* @return <tt>SCM(a, b)</tt>
|
||||
*/
|
||||
public static long scm(long a, long b) {
|
||||
// Quelle:
|
||||
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
||||
// Bonn, München Paris: Addison Wesley.
|
||||
// gill, Seite 141
|
||||
|
||||
if (a == 0 || b == 0) return 0;
|
||||
|
||||
a = Math.abs(a);
|
||||
b = Math.abs(b);
|
||||
if (b==1)return a;
|
||||
if (a==1)return b;
|
||||
|
||||
long u = a;
|
||||
long v = b;
|
||||
|
||||
// FIXME - Handle overflow
|
||||
while (a != b) {
|
||||
if (a < b) {
|
||||
b -= a;
|
||||
v += u;
|
||||
} else {
|
||||
a -= b;
|
||||
u += v;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//return a; // gcd
|
||||
return (u + v) / 2; // scm
|
||||
}
|
||||
/**
|
||||
* Returns an int whose value is the smallest common multiple of
|
||||
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
||||
* <tt>a==0 || b==0</tt>.
|
||||
*
|
||||
* @param a value with with the SCM is to be computed.
|
||||
* @param b value with with the SCM is to be computed.
|
||||
* @return <tt>SCM(a, b)</tt>
|
||||
*/
|
||||
public static BigInteger scm(BigInteger a, BigInteger b) {
|
||||
// Quelle:
|
||||
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
||||
// Bonn, München Paris: Addison Wesley.
|
||||
// gill, Seite 141
|
||||
|
||||
if (a.compareTo(BigInteger.ZERO) == 0 || b.compareTo(BigInteger.ZERO) == 0) {
|
||||
return BigInteger.ZERO;
|
||||
}
|
||||
|
||||
a = a.abs();
|
||||
b = b.abs();
|
||||
if (b.compareTo(BigInteger.ONE)==0)return a;
|
||||
if (a.compareTo(BigInteger.ONE)==0)return b;
|
||||
|
||||
BigInteger u = a;
|
||||
BigInteger v = b;
|
||||
|
||||
// FIXME - Handle overflow
|
||||
while (a.compareTo(b) != 0) {
|
||||
if (a .compareTo( b)<0) {
|
||||
b = b.subtract(a);
|
||||
v = v.add(u);
|
||||
} else {
|
||||
a = a.subtract(b);
|
||||
u = u.add(v);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//return a; // gcd
|
||||
return (u.add(v)).divide(BigInteger.valueOf(2)); // scm
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverses all 32 bits of the provided integer value.
|
||||
*/
|
||||
public static int reverseBits(int a) {
|
||||
return reverseBits(a, 32);
|
||||
}
|
||||
/**
|
||||
* Reverses specified number of bits of the provided integer value.
|
||||
* @param a The number.
|
||||
* @param numBits The number of bits (must be between 1 and 32).
|
||||
*/
|
||||
public static int reverseBits(int a, int numBits) {
|
||||
int b = 0;
|
||||
for (int i=0; i < numBits; i++) {
|
||||
b <<= 1;
|
||||
b |= (a & 1);
|
||||
a >>>= 1;
|
||||
}
|
||||
return b;
|
||||
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
for (int i=0; i < 8; i++) {
|
||||
int a = 1<<i;
|
||||
int b = reverseBits(a, 3);
|
||||
System.out.println(a+" - "+b);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user