aboutsummaryrefslogtreecommitdiff
path: root/src/bitboard.rs
diff options
context:
space:
mode:
authoreug-vs <eugene@eug-vs.xyz>2023-01-20 23:52:27 +0300
committereug-vs <eugene@eug-vs.xyz>2023-01-20 23:52:27 +0300
commit203abeafb94b977236bd6a9a2d0f33173f6f0d1b (patch)
treebb8e7410b791cd40596f171a819e25009e178eac /src/bitboard.rs
parent1b33595091334bb17db78298cad4eefa7b448c22 (diff)
downloadchessnost-203abeafb94b977236bd6a9a2d0f33173f6f0d1b.tar.gz
feat: implement Bitboard.pop_count()
Diffstat (limited to 'src/bitboard.rs')
-rw-r--r--src/bitboard.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/bitboard.rs b/src/bitboard.rs
new file mode 100644
index 0000000..a2d34cb
--- /dev/null
+++ b/src/bitboard.rs
@@ -0,0 +1,42 @@
+use std::fmt;
+
+pub struct Bitboard(pub u64);
+
+impl fmt::Display for Bitboard {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ for index in 0..64 {
+ f.write_str(if &self.0 >> index & 1 == 1 { "1" } else { "." });
+ if (index + 1) % 8 == 0 {
+ f.write_str("\n");
+ }
+ }
+ return write!(f, "\n")
+ }
+}
+
+impl Bitboard {
+ pub fn pop_count(&self) -> i32 {
+ if self.0 == 0 {
+ return 0;
+ }
+ return Bitboard::pop_count(&Bitboard(self.0 >> 1)) + (self.0 & 1) as i32;
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_print() {
+ const bb: Bitboard = Bitboard(127);
+ println!("{}", bb);
+ }
+
+ #[test]
+ fn test_pop_count() {
+ const bb: Bitboard = Bitboard(127);
+ assert_eq!(bb.pop_count(), 7);
+ }
+}
+