The Clojure bit functions do not currently provide a way to query the
count of set bits in a number. Attached is a small patch to implement
this feature. I've found it useful for implementing an immutable bit
array in Clojure.
I sent my CA in earlier this week.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---
=== modified file 'src/clj/clojure/core.clj'
--- src/clj/clojure/core.clj 2009-03-18 00:22:47 +0000
+++ src/clj/clojure/core.clj 2009-03-28 16:35:10 +0000
@@ -824,6 +824,9 @@
"Test bit at index n"
[x n] (. clojure.lang.Numbers testBit x n))
+(defn bit-count
+ "Returns the number of 1-bits"
+ [x] (. clojure.lang.Numbers bitCount x))
(defn bit-shift-left
"Bitwise shift left"
=== modified file 'src/jvm/clojure/lang/Numbers.java'
--- src/jvm/clojure/lang/Numbers.java 2009-02-17 19:29:19 +0000
+++ src/jvm/clojure/lang/Numbers.java 2009-04-03 12:02:33 +0000
@@ -89,6 +89,8 @@
public boolean testBit(Number x, int n);
+ public Number bitCount(Number x);
+
public Number shiftLeft(Number x, int n);
public Number shiftRight(Number x, int n);
@@ -336,6 +338,10 @@
return bitOps(x).testBit(x, n);
}
+static public Number bitCount(Number x){
+ return bitOps(x).bitCount(x);
+}
+
static public Number shiftLeft(Number x, int n){
return bitOps(x).shiftLeft(x, n);
}
@@ -1174,6 +1180,10 @@
return toBigInteger(x).testBit(n);
}
+ public Number bitCount(Number x){
+ return Integer.bitCount(x.intValue());
+ }
+
public Number shiftLeft(Number x, int n){
if(n < 32)
{
@@ -1257,6 +1267,10 @@
return toBigInteger(x).testBit(n);
}
+ public Number bitCount(Number x){
+ return Long.bitCount(x.longValue());
+ }
+
public Number shiftLeft(Number x, int n){
if(n < 0)
return shiftRight(x, -n);
@@ -1323,6 +1337,10 @@
return toBigInteger(x).testBit(n);
}
+ public Number bitCount(Number x){
+ return toBigInteger(x).bitCount();
+ }
+
public Number shiftLeft(Number x, int n){
return toBigInteger(x).shiftLeft(n);
}