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 clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
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);
 	}

Reply via email to