Răsfoiți Sursa

Improve bits.rotate_left*

gingerBill 5 ani în urmă
părinte
comite
8589af1458
1 a modificat fișierele cu 25 adăugiri și 9 ștergeri
  1. 25 9
      core/math/bits/bits.odin

+ 25 - 9
core/math/bits/bits.odin

@@ -123,16 +123,32 @@ count_zeros32  :: proc(i:  u32) ->  u32 { return  32 - count_ones32(i); }
 count_zeros64  :: proc(i:  u64) ->  u64 { return  64 - count_ones64(i); }
 
 
-rotate_left8   :: proc(i: u8,   s: uint) ->   u8 { return (i << s)|(i >> (8*size_of(u8)   - s)); }
-rotate_left16  :: proc(i: u16,  s: uint) ->  u16 { return (i << s)|(i >> (8*size_of(u16)  - s)); }
-rotate_left32  :: proc(i: u32,  s: uint) ->  u32 { return (i << s)|(i >> (8*size_of(u32)  - s)); }
-rotate_left64  :: proc(i: u64,  s: uint) ->  u64 { return (i << s)|(i >> (8*size_of(u64)  - s)); }
-
+rotate_left8 :: proc(x: u8,  k: int) -> u8 {
+	n :: 8;
+	s := uint(k) & (n-1);
+	return x <<s | x>>(n-s);
+}
+rotate_left16 :: proc(x: u16, k: int) -> u16 {
+	n :: 16;
+	s := uint(k) & (n-1);
+	return x <<s | x>>(n-s);
+}
+rotate_left32 :: proc(x: u32, k: int) -> u32 {
+	n :: 32;
+	s := uint(k) & (n-1);
+	return x <<s | x>>(n-s);
+}
+rotate_left64 :: proc(x: u64, k: int) -> u64 {
+	n :: 64;
+	s := uint(k) & (n-1);
+	return x <<s | x>>(n-s);
+}
 
-rotate_right8   :: proc(i: u8,   s: uint) ->   u8 { return (i >> s)|(i << (8*size_of(u8)   - s)); }
-rotate_right16  :: proc(i: u16,  s: uint) ->  u16 { return (i >> s)|(i << (8*size_of(u16)  - s)); }
-rotate_right32  :: proc(i: u32,  s: uint) ->  u32 { return (i >> s)|(i << (8*size_of(u32)  - s)); }
-rotate_right64  :: proc(i: u64,  s: uint) ->  u64 { return (i >> s)|(i << (8*size_of(u64)  - s)); }
+rotate_left :: proc(x: uint, k: int) -> uint {
+	n :: 8*size_of(uint);
+	s := uint(k) & (n-1);
+	return x <<s | x>>(n-s);
+}
 
 from_be_u8   :: proc(i:   u8) ->   u8 { return i; }
 from_be_u16  :: proc(i:  u16) ->  u16 { when ODIN_ENDIAN == "big" { return i; } else { return byte_swap(i); } }