Small speedup, per issue 422
[zxing.git] / core / src / com / google / zxing / common / reedsolomon / GF256.java
index b2e8877..9c58275 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * Copyright 2007 ZXing authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,15 +24,15 @@ package com.google.zxing.common.reedsolomon;
  * for convenience and speed (but at the cost of memory).
  * Only the bottom 8 bits are really used.</p>
  *
- * @author srowen@google.com (Sean Owen)
+ * @author Sean Owen
  */
 public final class GF256 {
 
   public static final GF256 QR_CODE_FIELD = new GF256(0x011D); // x^8 + x^4 + x^3 + x^2 + 1
   public static final GF256 DATA_MATRIX_FIELD = new GF256(0x012D); // x^8 + x^5 + x^3 + x^2 + 1
 
-  private final int[] exp;
-  private final int[] log;
+  private final int[] expTable;
+  private final int[] logTable;
   private final GF256Poly zero;
   private final GF256Poly one;
 
@@ -44,20 +44,20 @@ public final class GF256 {
    *  coefficient
    */
   private GF256(int primitive) {
-    exp = new int[256];
-    log = new int[256];
+    expTable = new int[256];
+    logTable = new int[256];
     int x = 1;
     for (int i = 0; i < 256; i++) {
-      exp[i] = x;
+      expTable[i] = x;
       x <<= 1; // x = x * 2; we're assuming the generator alpha is 2
       if (x >= 0x100) {
         x ^= primitive;
       }
     }
     for (int i = 0; i < 255; i++) {
-      log[exp[i]] = i;
+      logTable[expTable[i]] = i;
     }
-    // log[0] == 0 but this should never be used
+    // logTable[0] == 0 but this should never be used
     zero = new GF256Poly(this, new int[]{0});
     one = new GF256Poly(this, new int[]{1});
   }
@@ -90,7 +90,7 @@ public final class GF256 {
    *
    * @return sum/difference of a and b
    */
-  int addOrSubtract(int a, int b) {
+  static int addOrSubtract(int a, int b) {
     return a ^ b;
   }
 
@@ -98,7 +98,7 @@ public final class GF256 {
    * @return 2 to the power of a in GF(256)
    */
   int exp(int a) {
-    return exp[a];
+    return expTable[a];
   }
 
   /**
@@ -108,7 +108,7 @@ public final class GF256 {
     if (a == 0) {
       throw new IllegalArgumentException();
     }
-    return log[a];
+    return logTable[a];
   }
 
   /**
@@ -118,7 +118,7 @@ public final class GF256 {
     if (a == 0) {
       throw new ArithmeticException();
     }
-    return exp[255 - log[a]];
+    return expTable[255 - logTable[a]];
   }
 
   /**
@@ -130,13 +130,10 @@ public final class GF256 {
     if (a == 0 || b == 0) {
       return 0;
     }
-    if (a == 1) {
-      return b;
-    }
-    if (b == 1) {
-      return a;
-    }
-    return exp[(log[a] + log[b]) % 255];
+    int logSum = logTable[a] + logTable[b];
+    // index is a sped-up alternative to logSum % 255 since sum
+    // is in [0,510]. Thanks to jmsachs for the idea
+    return expTable[(logSum & 0xFF) + (logSum >>> 8)];
   }
 
-}
\ No newline at end of file
+}