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); }