shift.rs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. use ibig::{ibig, ubig};
  2. #[test]
  3. #[allow(clippy::identity_op, clippy::op_ref)]
  4. fn test_ubig_shl() {
  5. assert_eq!(ubig!(0) << 17, ubig!(0));
  6. assert_eq!(&ubig!(0) << 17, ubig!(0));
  7. assert_eq!(ubig!(0xef) << 0, ubig!(0xef));
  8. assert_eq!(ubig!(0xef) << 4, ubig!(0xef0));
  9. assert_eq!(
  10. ubig!(0xef) << 128,
  11. ubig!(_0xef00000000000000000000000000000000)
  12. );
  13. assert_eq!(
  14. ubig!(0xef) << 124,
  15. ubig!(_0xef0000000000000000000000000000000)
  16. );
  17. assert_eq!(ubig!(0xef) << 10240, ubig!(_0xef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000));
  18. assert_eq!(ubig!(0xef) << 10244, ubig!(_0xef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000));
  19. assert_eq!(
  20. ubig!(_0x0123456789abcdef0123456789abcdef) << 0,
  21. ubig!(_0x0123456789abcdef0123456789abcdef)
  22. );
  23. assert_eq!(
  24. ubig!(_0x0123456789abcdef0123456789abcdef) << 4,
  25. ubig!(_0x0123456789abcdef0123456789abcdef0)
  26. );
  27. assert_eq!(
  28. ubig!(_0x0123456789abcdef0123456789abcdef) << 128,
  29. ubig!(_0x0123456789abcdef0123456789abcdef00000000000000000000000000000000)
  30. );
  31. assert_eq!(
  32. &ubig!(_0x0123456789abcdef0123456789abcdef) << 128,
  33. ubig!(_0x0123456789abcdef0123456789abcdef00000000000000000000000000000000)
  34. );
  35. assert_eq!(
  36. ubig!(_0x0123456789abcdef0123456789abcdef) << 124,
  37. ubig!(_0x0123456789abcdef0123456789abcdef0000000000000000000000000000000)
  38. );
  39. assert_eq!(
  40. &ubig!(_0x0123456789abcdef0123456789abcdef) << 124,
  41. ubig!(_0x0123456789abcdef0123456789abcdef0000000000000000000000000000000)
  42. );
  43. assert_eq!(ubig!(_0x0123456789abcdef0123456789abcdef) << 10240,
  44. ubig!(_0x0123456789abcdef0123456789abcdef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000));
  45. assert_eq!(ubig!(_0x0123456789abcdef0123456789abcdef) << 10244,
  46. ubig!(_0x0123456789abcdef0123456789abcdef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000));
  47. assert_eq!(&ubig!(0xef) << 4, ubig!(0xef0));
  48. assert_eq!(ubig!(0xef) << &4, ubig!(0xef0));
  49. assert_eq!(&ubig!(0xef) << &4, ubig!(0xef0));
  50. }
  51. #[test]
  52. #[should_panic]
  53. fn test_ubig_shl_too_large() {
  54. let _ = ubig!(1) << usize::MAX;
  55. }
  56. #[test]
  57. #[allow(clippy::op_ref)]
  58. fn test_ibig_shl() {
  59. assert_eq!(ibig!(0) << 4, ibig!(0));
  60. assert_eq!(ibig!(0) << usize::MAX, ibig!(0));
  61. assert_eq!(ibig!(0xef) << 4, ibig!(0xef0));
  62. assert_eq!(&ibig!(0xef) << 4, ibig!(0xef0));
  63. assert_eq!(ibig!(0xef) << &4, ibig!(0xef0));
  64. assert_eq!(&ibig!(0xef) << &4, ibig!(0xef0));
  65. }
  66. #[test]
  67. fn test_shl_assign() {
  68. let mut a = ubig!(0xef);
  69. a <<= 4;
  70. assert_eq!(a, ubig!(0xef0));
  71. a <<= &4;
  72. assert_eq!(a, ubig!(0xef00));
  73. }
  74. #[test]
  75. #[allow(clippy::identity_op, clippy::op_ref)]
  76. fn test_ubig_shr() {
  77. assert_eq!(ubig!(0xef) >> 4, ubig!(0xe));
  78. assert_eq!(ubig!(0xef) >> &4, ubig!(0xe));
  79. assert_eq!(&ubig!(0xef) >> 4, ubig!(0xe));
  80. assert_eq!(&ubig!(0xef) >> &4, ubig!(0xe));
  81. assert_eq!(ubig!(0xef) >> 100, ubig!(0));
  82. assert_eq!(&ubig!(0xef) >> 100, ubig!(0));
  83. assert_eq!(ubig!(0xef) >> usize::MAX, ubig!(0));
  84. assert_eq!(&ubig!(0xef) >> usize::MAX, ubig!(0));
  85. assert_eq!((ubig!(0xef) << 63) >> 63, ubig!(0xef));
  86. assert_eq!((ubig!(0xef) << 64) >> 64, ubig!(0xef));
  87. assert_eq!((ubig!(0xef) << 1023) >> 1023, ubig!(0xef));
  88. assert_eq!((ubig!(0xef) << 1024) >> 1024, ubig!(0xef));
  89. assert_eq!(((ubig!(0xef) << 1024) >> 512) >> 512, ubig!(0xef));
  90. assert_eq!(((ubig!(0xef) << 1024) >> 510) >> 514, ubig!(0xef));
  91. assert_eq!(&(&(ubig!(0xef) << 1024) >> 512) >> 512, ubig!(0xef));
  92. assert_eq!(&(&(ubig!(0xef) << 1024) >> 510) >> 514, ubig!(0xef));
  93. assert_eq!(
  94. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 0,
  95. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef)
  96. );
  97. assert_eq!(
  98. &ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 0,
  99. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef)
  100. );
  101. assert_eq!(
  102. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 1000000,
  103. ubig!(0)
  104. );
  105. assert_eq!(
  106. &ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 1000000,
  107. ubig!(0)
  108. );
  109. assert_eq!(
  110. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 1000001,
  111. ubig!(0)
  112. );
  113. assert_eq!(
  114. &ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 1000001,
  115. ubig!(0)
  116. );
  117. assert_eq!(
  118. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 4,
  119. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcde)
  120. );
  121. assert_eq!(
  122. &ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 4,
  123. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcde)
  124. );
  125. assert_eq!(
  126. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 64,
  127. ubig!(_0x0123456789abcdef0123456789abcdef)
  128. );
  129. assert_eq!(
  130. &ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 64,
  131. ubig!(_0x0123456789abcdef0123456789abcdef)
  132. );
  133. assert_eq!(
  134. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 124,
  135. ubig!(_0x123456789abcdef0)
  136. );
  137. assert_eq!(
  138. &ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 124,
  139. ubig!(_0x123456789abcdef0)
  140. );
  141. assert_eq!(
  142. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 128,
  143. ubig!(_0x123456789abcdef)
  144. );
  145. assert_eq!(
  146. &ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 128,
  147. ubig!(_0x123456789abcdef)
  148. );
  149. assert_eq!(ubig!(0xef) >> &4, ubig!(0xe));
  150. assert_eq!(&ubig!(0xef) >> 4, ubig!(0xe));
  151. assert_eq!(&ubig!(0xef) >> &4, ubig!(0xe));
  152. assert_eq!(
  153. &ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcdef) >> 4,
  154. ubig!(_0x0123456789abcdef0123456789abcdef0123456789abcde)
  155. );
  156. }
  157. #[test]
  158. fn test_ubig_shr_assign() {
  159. let mut a = ubig!(0xeff);
  160. a >>= 4;
  161. assert_eq!(a, ubig!(0xef));
  162. a >>= &4;
  163. assert_eq!(a, ubig!(0xe));
  164. }
  165. #[test]
  166. fn test_ibig_shr() {
  167. let test_cases = [
  168. (ibig!(0xe0), 4, ibig!(0xe)),
  169. (ibig!(0xef), 4, ibig!(0xe)),
  170. (ibig!(0xef), 100, ibig!(0)),
  171. (ibig!(-0xe0), 4, ibig!(-0xe)),
  172. (ibig!(-0xef), 4, ibig!(-0xf)),
  173. (ibig!(-0xef), 100, ibig!(-1)),
  174. (ibig!(0xff) << 1000, 1000, ibig!(0xff)),
  175. ((ibig!(0xff) << 1000) + ibig!(1), 1000, ibig!(0xff)),
  176. (ibig!(-0xff) << 1000, 1000, ibig!(-0xff)),
  177. ((ibig!(-0xff) << 1000) - ibig!(1), 1000, ibig!(-0x100)),
  178. (
  179. (ibig!(-0xff) << 1000) - (ibig!(1) << 999),
  180. 1000,
  181. ibig!(-0x100),
  182. ),
  183. (ibig!(-0xff) << 1000, 2000, ibig!(-1)),
  184. ];
  185. for (a, b, c) in &test_cases {
  186. assert_eq!(a >> b, *c);
  187. assert_eq!(a >> *b, *c);
  188. assert_eq!(a.clone() >> b, *c);
  189. assert_eq!(a.clone() >> *b, *c);
  190. let mut x = a.clone();
  191. x >>= b;
  192. assert_eq!(x, *c);
  193. let mut x = a.clone();
  194. x >>= *b;
  195. assert_eq!(x, *c);
  196. }
  197. }