BitMult.java
package progen.kernel.functions;
import java.util.List;
import java.util.Map;
import progen.kernel.tree.Node;
import progen.userprogram.UserProgram;
/**
* @author Alberto Vegas Estrada
* @version 1.0
*/
public class BitMult extends NonTerminal {
private static final int NUMBER_OF_BITS = 32;
private static final long serialVersionUID = -7114934864153434702L;
/**
* Default constructor.
*/
public BitMult() {
super("int$$int$$int", "*");
}
@Override
public Object evaluate(List<Node> arguments, UserProgram userProgram, Map<String, Object> returnAddr) {
final int firstOperator = (Integer) arguments.get(0).evaluate(userProgram, returnAddr);
final int secondOperator = (Integer) arguments.get(1).evaluate(userProgram, returnAddr);
Integer result = 0;
for (int i = 0; i < NUMBER_OF_BITS; i++) {
// Generate a mask with a 1 in position i
final int mask = 1 << i;
// Make X AND mask. Then count the number of bits set to 1 in the result.
// There
// will be one or zero bits set to 1. If there is one, that means that
// there is
// a 1 in position x_i, or a 0 otherwise.
final int count = Integer.bitCount(mask & firstOperator);
// If there were a 1 in x_i, then add to result the value 2^i * Y (or
// which is the same Y << i)
if (count > 0) {
result += secondOperator << i;
}
}
return (Integer) result;
}
}