bits.rs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. use ibig::{
  2. ibig,
  3. ops::{AndNot, NextPowerOfTwo},
  4. ubig, IBig,
  5. };
  6. #[test]
  7. #[allow(clippy::bool_assert_comparison)]
  8. fn test_bit() {
  9. assert_eq!(ubig!(0).bit(0), false);
  10. assert_eq!(ubig!(0).bit(1000), false);
  11. assert_eq!(ubig!(0b11101).bit(0), true);
  12. assert_eq!(ubig!(0b11101).bit(1), false);
  13. assert_eq!(ubig!(0b11101).bit(4), true);
  14. assert_eq!(ubig!(0b11101).bit(5), false);
  15. assert_eq!(ubig!(0b11101).bit(1000), false);
  16. assert_eq!(ubig!(_0xffffffffffffffffffffffffffffffff).bit(127), true);
  17. assert_eq!(ubig!(_0xffffffffffffffffffffffffffffffff).bit(128), false);
  18. }
  19. #[test]
  20. fn test_set_bit() {
  21. let mut a = ubig!(0);
  22. a.set_bit(3);
  23. assert_eq!(a, ubig!(0b1000));
  24. a.set_bit(129);
  25. assert_eq!(a, ubig!(_0x200000000000000000000000000000008));
  26. a.set_bit(1);
  27. assert_eq!(a, ubig!(_0x20000000000000000000000000000000a));
  28. a.set_bit(1);
  29. assert_eq!(a, ubig!(_0x20000000000000000000000000000000a));
  30. a.set_bit(127);
  31. assert_eq!(a, ubig!(_0x28000000000000000000000000000000a));
  32. a.set_bit(194);
  33. assert_eq!(
  34. a,
  35. ubig!(_0x400000000000000028000000000000000000000000000000a)
  36. );
  37. }
  38. #[test]
  39. fn test_clear_bit() {
  40. let mut a = ubig!(_0x400000000000000028000000000000000000000000000000a);
  41. a.clear_bit(10000);
  42. assert_eq!(
  43. a,
  44. ubig!(_0x400000000000000028000000000000000000000000000000a)
  45. );
  46. a.clear_bit(194);
  47. assert_eq!(a, ubig!(_0x28000000000000000000000000000000a));
  48. a.clear_bit(1);
  49. assert_eq!(a, ubig!(_0x280000000000000000000000000000008));
  50. a.clear_bit(129);
  51. assert_eq!(a, ubig!(_0x80000000000000000000000000000008));
  52. a.clear_bit(127);
  53. assert_eq!(a, ubig!(0b1000));
  54. a.clear_bit(3);
  55. assert_eq!(a, ubig!(0));
  56. }
  57. #[test]
  58. fn test_trailing_zeros() {
  59. assert_eq!(ubig!(0).trailing_zeros(), None);
  60. assert_eq!(ubig!(0xf0000).trailing_zeros(), Some(16));
  61. assert_eq!(
  62. ubig!(_0xfffffffffffffffffffff00000000000000000000000000000000000000000000000000)
  63. .trailing_zeros(),
  64. Some(200)
  65. );
  66. assert_eq!(ibig!(0).trailing_zeros(), None);
  67. assert_eq!(ibig!(0xf0000).trailing_zeros(), Some(16));
  68. assert_eq!(ibig!(-0xf0000).trailing_zeros(), Some(16));
  69. }
  70. #[test]
  71. fn test_bit_len() {
  72. assert_eq!(ubig!(0).bit_len(), 0);
  73. assert_eq!(ubig!(0xf0000).bit_len(), 20);
  74. assert_eq!(
  75. ubig!(_0xfffffffffffffffffffff00000000000000000000000000000000000000000000000000).bit_len(),
  76. 284
  77. );
  78. }
  79. #[test]
  80. #[allow(clippy::bool_assert_comparison)]
  81. fn test_is_power_of_two() {
  82. assert_eq!(ubig!(0).is_power_of_two(), false);
  83. assert_eq!(ubig!(1).is_power_of_two(), true);
  84. assert_eq!(ubig!(16).is_power_of_two(), true);
  85. assert_eq!(ubig!(17).is_power_of_two(), false);
  86. assert_eq!(
  87. ubig!(_0x4000000000000000000000000000000000000000000000).is_power_of_two(),
  88. true
  89. );
  90. assert_eq!(
  91. ubig!(_0x5000000000000000000000000000000000000000000000).is_power_of_two(),
  92. false
  93. );
  94. assert_eq!(
  95. ubig!(_0x4000000000000000000000010000000000000000000000).is_power_of_two(),
  96. false
  97. );
  98. }
  99. #[test]
  100. fn test_next_power_of_two() {
  101. assert_eq!(ubig!(0).next_power_of_two(), ubig!(1));
  102. assert_eq!((&ubig!(0)).next_power_of_two(), ubig!(1));
  103. assert_eq!(ubig!(16).next_power_of_two(), ubig!(16));
  104. assert_eq!(ubig!(17).next_power_of_two(), ubig!(32));
  105. assert_eq!(ubig!(_0xffffffff).next_power_of_two(), ubig!(_0x100000000));
  106. assert_eq!(
  107. ubig!(_0xffffffffffffffff).next_power_of_two(),
  108. ubig!(_0x10000000000000000)
  109. );
  110. assert_eq!(
  111. ubig!(_0xffffffffffffffffffffffffffffffff).next_power_of_two(),
  112. ubig!(_0x100000000000000000000000000000000)
  113. );
  114. assert_eq!(
  115. ubig!(_0xf0000000000000000000000000000000).next_power_of_two(),
  116. ubig!(_0x100000000000000000000000000000000)
  117. );
  118. assert_eq!(
  119. ubig!(_0xffffffffffffffff0000000000000000).next_power_of_two(),
  120. ubig!(_0x100000000000000000000000000000000)
  121. );
  122. assert_eq!(
  123. ubig!(_0xffffffffffffffff0000000000000000).next_power_of_two(),
  124. ubig!(_0x100000000000000000000000000000000)
  125. );
  126. assert_eq!(
  127. ubig!(_0x100000000000000000000000000000000).next_power_of_two(),
  128. ubig!(_0x100000000000000000000000000000000)
  129. );
  130. assert_eq!(
  131. ubig!(_0x100000000000000000000000000000001).next_power_of_two(),
  132. ubig!(_0x200000000000000000000000000000000)
  133. );
  134. assert_eq!(
  135. ubig!(_0x100100000000000000000000000000000).next_power_of_two(),
  136. ubig!(_0x200000000000000000000000000000000)
  137. );
  138. }
  139. #[test]
  140. fn test_and_ubig() {
  141. let cases = [
  142. (ubig!(0xf0f0), ubig!(0xff00), ubig!(0xf000)),
  143. (
  144. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  145. ubig!(0xff),
  146. ubig!(0xee),
  147. ),
  148. (
  149. ubig!(0xff),
  150. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  151. ubig!(0xee),
  152. ),
  153. (
  154. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  155. ubig!(_0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd),
  156. ubig!(_0xcccccccccccccccccccccccccccccccc),
  157. ),
  158. (
  159. ubig!(_0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd),
  160. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  161. ubig!(_0xcccccccccccccccccccccccccccccccc),
  162. ),
  163. ];
  164. for (a, b, c) in cases.iter() {
  165. assert_eq!(a & b, *c);
  166. assert_eq!(a.clone() & b, *c);
  167. assert_eq!(a & b.clone(), *c);
  168. assert_eq!(a.clone() & b.clone(), *c);
  169. {
  170. let mut a1 = a.clone();
  171. a1 &= b;
  172. assert_eq!(a1, *c);
  173. }
  174. {
  175. let mut a1 = a.clone();
  176. a1 &= b.clone();
  177. assert_eq!(a1, *c);
  178. }
  179. }
  180. }
  181. #[test]
  182. fn test_or_ubig() {
  183. let cases = [
  184. (ubig!(0xf0f0), ubig!(0xff00), ubig!(0xfff0)),
  185. (
  186. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  187. ubig!(0xff),
  188. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeff),
  189. ),
  190. (
  191. ubig!(0xff),
  192. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  193. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeff),
  194. ),
  195. (
  196. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  197. ubig!(_0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd),
  198. ubig!(_0xddddddddddddddddddddddddddddddddffffffffffffffffffffffffffffffff),
  199. ),
  200. (
  201. ubig!(_0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd),
  202. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  203. ubig!(_0xddddddddddddddddddddddddddddddddffffffffffffffffffffffffffffffff),
  204. ),
  205. ];
  206. for (a, b, c) in cases.iter() {
  207. assert_eq!(a | b, *c);
  208. assert_eq!(a.clone() | b, *c);
  209. assert_eq!(a | b.clone(), *c);
  210. assert_eq!(a.clone() | b.clone(), *c);
  211. {
  212. let mut a1 = a.clone();
  213. a1 |= b;
  214. assert_eq!(a1, *c);
  215. }
  216. {
  217. let mut a1 = a.clone();
  218. a1 |= b.clone();
  219. assert_eq!(a1, *c);
  220. }
  221. }
  222. }
  223. #[test]
  224. fn test_xor_ubig() {
  225. let cases = [
  226. (ubig!(0xf0f0), ubig!(0xff00), ubig!(0xff0)),
  227. (
  228. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  229. ubig!(0xff),
  230. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeee11),
  231. ),
  232. (
  233. ubig!(0xff),
  234. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  235. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeee11),
  236. ),
  237. (
  238. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  239. ubig!(_0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd),
  240. ubig!(_0xdddddddddddddddddddddddddddddddd33333333333333333333333333333333),
  241. ),
  242. (
  243. ubig!(_0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd),
  244. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  245. ubig!(_0xdddddddddddddddddddddddddddddddd33333333333333333333333333333333),
  246. ),
  247. ];
  248. for (a, b, c) in cases.iter() {
  249. assert_eq!(a ^ b, *c);
  250. assert_eq!(a.clone() ^ b, *c);
  251. assert_eq!(a ^ b.clone(), *c);
  252. assert_eq!(a.clone() ^ b.clone(), *c);
  253. {
  254. let mut a1 = a.clone();
  255. a1 ^= b;
  256. assert_eq!(a1, *c);
  257. }
  258. {
  259. let mut a1 = a.clone();
  260. a1 ^= b.clone();
  261. assert_eq!(a1, *c);
  262. }
  263. }
  264. }
  265. #[test]
  266. fn test_and_not_ubig() {
  267. let cases = [
  268. (ubig!(0xf0f0), ubig!(0xff00), ubig!(0xf0)),
  269. (
  270. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  271. ubig!(0xff),
  272. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00),
  273. ),
  274. (
  275. ubig!(0xff),
  276. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  277. ubig!(0x11),
  278. ),
  279. (
  280. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  281. ubig!(_0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd),
  282. ubig!(_0x22222222222222222222222222222222),
  283. ),
  284. (
  285. ubig!(_0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd),
  286. ubig!(_0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
  287. ubig!(_0xdddddddddddddddddddddddddddddddd11111111111111111111111111111111),
  288. ),
  289. ];
  290. for (a, b, c) in cases.iter() {
  291. assert_eq!(a.and_not(b), *c);
  292. assert_eq!(a.clone().and_not(b), *c);
  293. assert_eq!(a.and_not(b.clone()), *c);
  294. assert_eq!(a.clone().and_not(b.clone()), *c);
  295. }
  296. }
  297. #[test]
  298. fn test_not_ibig() {
  299. for a in -20i8..=20i8 {
  300. let a_big: IBig = a.into();
  301. let res: IBig = (!a).into();
  302. assert_eq!(!&a_big, res);
  303. assert_eq!(!a_big, res);
  304. }
  305. }
  306. #[test]
  307. fn test_and_ibig() {
  308. for a in -20i8..=20i8 {
  309. for b in -20i8..=20i8 {
  310. let a_big: IBig = a.into();
  311. let b_big: IBig = b.into();
  312. let res: IBig = (a & b).into();
  313. assert_eq!(&a_big & &b_big, res);
  314. assert_eq!(&a_big & b_big.clone(), res);
  315. assert_eq!(a_big.clone() & &b_big, res);
  316. assert_eq!(a_big.clone() & b_big.clone(), res);
  317. let mut x = a_big.clone();
  318. x &= &b_big;
  319. assert_eq!(x, res);
  320. let mut x = a_big.clone();
  321. x &= b_big.clone();
  322. assert_eq!(x, res);
  323. }
  324. }
  325. }
  326. #[test]
  327. fn test_or_ibig() {
  328. for a in -20i8..=20i8 {
  329. for b in -20i8..=20i8 {
  330. let a_big: IBig = a.into();
  331. let b_big: IBig = b.into();
  332. let res: IBig = (a | b).into();
  333. assert_eq!(&a_big | &b_big, res);
  334. assert_eq!(&a_big | b_big.clone(), res);
  335. assert_eq!(a_big.clone() | &b_big, res);
  336. assert_eq!(a_big.clone() | b_big.clone(), res);
  337. let mut x = a_big.clone();
  338. x |= &b_big;
  339. assert_eq!(x, res);
  340. let mut x = a_big.clone();
  341. x |= b_big.clone();
  342. assert_eq!(x, res);
  343. }
  344. }
  345. }
  346. #[test]
  347. fn test_xor_ibig() {
  348. for a in -20i8..=20i8 {
  349. for b in -20i8..=20i8 {
  350. let a_big: IBig = a.into();
  351. let b_big: IBig = b.into();
  352. let res: IBig = (a ^ b).into();
  353. assert_eq!(&a_big ^ &b_big, res);
  354. assert_eq!(&a_big ^ b_big.clone(), res);
  355. assert_eq!(a_big.clone() ^ &b_big, res);
  356. assert_eq!(a_big.clone() ^ b_big.clone(), res);
  357. let mut x = a_big.clone();
  358. x ^= &b_big;
  359. assert_eq!(x, res);
  360. let mut x = a_big.clone();
  361. x ^= b_big.clone();
  362. assert_eq!(x, res);
  363. }
  364. }
  365. }
  366. #[test]
  367. fn test_and_not_ibig() {
  368. for a in -20i8..=20i8 {
  369. for b in -20i8..=20i8 {
  370. let a_big: IBig = a.into();
  371. let b_big: IBig = b.into();
  372. let res: IBig = (a & !b).into();
  373. assert_eq!((&a_big).and_not(&b_big), res);
  374. assert_eq!((&a_big).and_not(b_big.clone()), res);
  375. assert_eq!(a_big.clone().and_not(&b_big), res);
  376. assert_eq!(a_big.clone().and_not(b_big.clone()), res);
  377. }
  378. }
  379. }
  380. #[test]
  381. #[allow(clippy::identity_op, clippy::op_ref)]
  382. fn test_bit_ops_ubig_unsigned() {
  383. assert_eq!(ubig!(0xf0f) & 0xffu8, 0xfu8);
  384. assert_eq!(ubig!(0xf0f) & &0xffu8, 0xfu8);
  385. assert_eq!(&ubig!(0xf0f) & 0xffu8, 0xfu8);
  386. assert_eq!(&ubig!(0xf0f) & &0xffu8, 0xfu8);
  387. assert_eq!(0xffu8 & ubig!(0xf0f), 0xfu8);
  388. assert_eq!(0xffu8 & &ubig!(0xf0f), 0xfu8);
  389. assert_eq!(&0xffu8 & ubig!(0xf0f), 0xfu8);
  390. assert_eq!(&0xffu8 & &ubig!(0xf0f), 0xfu8);
  391. let mut x = ubig!(0xf0f);
  392. x &= 0xffu8;
  393. assert_eq!(x, ubig!(0xf));
  394. let mut x = ubig!(0xf0f);
  395. x &= &0xffu8;
  396. assert_eq!(x, ubig!(0xf));
  397. assert_eq!(ubig!(0xf0f) | 0xffu8, ubig!(0xfff));
  398. assert_eq!(ubig!(0xf0f) | &0xffu8, ubig!(0xfff));
  399. assert_eq!((&ubig!(0xf0f)) | 0xffu8, ubig!(0xfff));
  400. assert_eq!((&ubig!(0xf0f)) | &0xffu8, ubig!(0xfff));
  401. assert_eq!(0xffu8 | ubig!(0xf0f), ubig!(0xfff));
  402. assert_eq!(0xffu8 | &ubig!(0xf0f), ubig!(0xfff));
  403. assert_eq!(&0xffu8 | ubig!(0xf0f), ubig!(0xfff));
  404. assert_eq!(&0xffu8 | &ubig!(0xf0f), ubig!(0xfff));
  405. let mut x = ubig!(0xf0f);
  406. x |= 0xffu8;
  407. assert_eq!(x, ubig!(0xfff));
  408. let mut x = ubig!(0xf0f);
  409. x |= &0xffu8;
  410. assert_eq!(x, ubig!(0xfff));
  411. assert_eq!(ubig!(0xf0f) ^ 0xffu8, ubig!(0xff0));
  412. assert_eq!(ubig!(0xf0f) ^ &0xffu8, ubig!(0xff0));
  413. assert_eq!(&ubig!(0xf0f) ^ 0xffu8, ubig!(0xff0));
  414. assert_eq!(&ubig!(0xf0f) ^ &0xffu8, ubig!(0xff0));
  415. assert_eq!(0xffu8 ^ ubig!(0xf0f), ubig!(0xff0));
  416. assert_eq!(0xffu8 ^ &ubig!(0xf0f), ubig!(0xff0));
  417. assert_eq!(&0xffu8 ^ ubig!(0xf0f), ubig!(0xff0));
  418. assert_eq!(&0xffu8 ^ &ubig!(0xf0f), ubig!(0xff0));
  419. let mut x = ubig!(0xf0f);
  420. x ^= 0xffu8;
  421. assert_eq!(x, ubig!(0xff0));
  422. let mut x = ubig!(0xf0f);
  423. x ^= &0xffu8;
  424. assert_eq!(x, ubig!(0xff0));
  425. assert_eq!(ubig!(0xf0f).and_not(0xffu8), ubig!(0xf00));
  426. assert_eq!(ubig!(0xf0f).and_not(&0xffu8), ubig!(0xf00));
  427. assert_eq!((&ubig!(0xf0f)).and_not(0xffu8), ubig!(0xf00));
  428. assert_eq!((&ubig!(0xf0f)).and_not(&0xffu8), ubig!(0xf00));
  429. }
  430. #[test]
  431. #[allow(clippy::identity_op, clippy::op_ref)]
  432. fn test_bit_ops_ubig_signed() {
  433. assert_eq!(ubig!(0xf0f) & 0xff, ubig!(0xf));
  434. assert_eq!(ubig!(0xf0f) & &0xff, ubig!(0xf));
  435. assert_eq!(&ubig!(0xf0f) & 0xff, ubig!(0xf));
  436. assert_eq!(&ubig!(0xf0f) & &0xff, ubig!(0xf));
  437. assert_eq!(ubig!(0xf0f) & -2, ubig!(0xf0e));
  438. assert_eq!(ubig!(0xf0f) & &-2, ubig!(0xf0e));
  439. assert_eq!(&ubig!(0xf0f) & -2, ubig!(0xf0e));
  440. assert_eq!(&ubig!(0xf0f) & &-2, ubig!(0xf0e));
  441. assert_eq!(0xff & ubig!(0xf0f), ubig!(0xf));
  442. assert_eq!(0xff & &ubig!(0xf0f), ubig!(0xf));
  443. assert_eq!(&0xff & ubig!(0xf0f), ubig!(0xf));
  444. assert_eq!(&0xff & &ubig!(0xf0f), ubig!(0xf));
  445. let mut x = ubig!(0xf0f);
  446. x &= 0xff;
  447. assert_eq!(x, ubig!(0xf));
  448. let mut x = ubig!(0xf0f);
  449. x &= &0xff;
  450. assert_eq!(x, ubig!(0xf));
  451. assert_eq!(ubig!(0xf0f) | 0xff, ubig!(0xfff));
  452. assert_eq!(ubig!(0xf0f) | &0xff, ubig!(0xfff));
  453. assert_eq!(&ubig!(0xf0f) | 0xff, ubig!(0xfff));
  454. assert_eq!(&ubig!(0xf0f) | &0xff, ubig!(0xfff));
  455. assert_eq!(0xff | ubig!(0xf0f), ubig!(0xfff));
  456. assert_eq!(0xff | (&ubig!(0xf0f)), ubig!(0xfff));
  457. assert_eq!(&0xff | ubig!(0xf0f), ubig!(0xfff));
  458. assert_eq!(&0xff | &ubig!(0xf0f), ubig!(0xfff));
  459. let mut x = ubig!(0xf0f);
  460. x |= 0xff;
  461. assert_eq!(x, ubig!(0xfff));
  462. let mut x = ubig!(0xf0f);
  463. x |= &0xff;
  464. assert_eq!(x, ubig!(0xfff));
  465. assert_eq!(ubig!(0xf0f) ^ 0xff, ubig!(0xff0));
  466. assert_eq!(ubig!(0xf0f) ^ &0xff, ubig!(0xff0));
  467. assert_eq!(&ubig!(0xf0f) ^ 0xff, ubig!(0xff0));
  468. assert_eq!(&ubig!(0xf0f) ^ &0xff, ubig!(0xff0));
  469. assert_eq!(0xff ^ ubig!(0xf0f), ubig!(0xff0));
  470. assert_eq!(0xff ^ &ubig!(0xf0f), ubig!(0xff0));
  471. assert_eq!(&0xff ^ ubig!(0xf0f), ubig!(0xff0));
  472. assert_eq!(&0xff ^ &ubig!(0xf0f), ubig!(0xff0));
  473. let mut x = ubig!(0xf0f);
  474. x ^= 0xff;
  475. assert_eq!(x, ubig!(0xff0));
  476. let mut x = ubig!(0xf0f);
  477. x ^= &0xff;
  478. assert_eq!(x, ubig!(0xff0));
  479. assert_eq!(ubig!(0xf0f).and_not(0xff), ubig!(0xf00));
  480. assert_eq!(ubig!(0xf0f).and_not(&0xff), ubig!(0xf00));
  481. assert_eq!((&ubig!(0xf0f)).and_not(0xff), ubig!(0xf00));
  482. assert_eq!((&ubig!(0xf0f)).and_not(&0xff), ubig!(0xf00));
  483. assert_eq!(ubig!(0xf0f).and_not(-2), ubig!(1));
  484. assert_eq!(ubig!(0xf0f).and_not(&-2), ubig!(1));
  485. assert_eq!((&ubig!(0xf0f)).and_not(-2), ubig!(1));
  486. assert_eq!((&ubig!(0xf0f)).and_not(&-2), ubig!(1));
  487. }
  488. #[test]
  489. #[should_panic]
  490. fn test_ubig_or_signed_overflow() {
  491. let _ = ubig!(1) | -1;
  492. }
  493. #[test]
  494. #[should_panic]
  495. fn test_ubig_xor_signed_overflow() {
  496. let _ = ubig!(1) ^ -1;
  497. }
  498. #[test]
  499. #[allow(clippy::identity_op, clippy::op_ref)]
  500. fn test_bit_ops_ibig_primitive() {
  501. assert_eq!(ibig!(0xf0f) & 0xffu8, 0xfu8);
  502. assert_eq!(ibig!(0xf0f) & &0xffu8, 0xfu8);
  503. assert_eq!(&ibig!(0xf0f) & 0xffu8, 0xfu8);
  504. assert_eq!(&ibig!(0xf0f) & &0xffu8, 0xfu8);
  505. assert_eq!(0xffu8 & ibig!(0xf0f), 0xfu8);
  506. assert_eq!(0xffu8 & &ibig!(0xf0f), 0xfu8);
  507. assert_eq!(&0xffu8 & ibig!(0xf0f), 0xfu8);
  508. assert_eq!(&0xffu8 & &ibig!(0xf0f), 0xfu8);
  509. assert_eq!(ibig!(0xf0f) & 0xff, ibig!(0xf));
  510. assert_eq!(ibig!(0xf0f) & &0xff, ibig!(0xf));
  511. assert_eq!(&ibig!(0xf0f) & 0xff, ibig!(0xf));
  512. assert_eq!(&ibig!(0xf0f) & &0xff, ibig!(0xf));
  513. assert_eq!(ibig!(-1) & 0xffu8, 0xffu8);
  514. assert_eq!(ibig!(-1) & -1, ibig!(-1));
  515. let mut x = ibig!(0xf0f);
  516. x &= 0xff;
  517. assert_eq!(x, ibig!(0xf));
  518. let mut x = ibig!(0xf0f);
  519. x &= &0xff;
  520. assert_eq!(x, ibig!(0xf));
  521. assert_eq!(ibig!(0xf0f) | 0xff, ibig!(0xfff));
  522. assert_eq!(ibig!(0xf0f) | &0xff, ibig!(0xfff));
  523. assert_eq!((&ibig!(0xf0f)) | 0xff, ibig!(0xfff));
  524. assert_eq!((&ibig!(0xf0f)) | &0xff, ibig!(0xfff));
  525. assert_eq!(0xff | ibig!(0xf0f), ibig!(0xfff));
  526. assert_eq!(0xff | &ibig!(0xf0f), ibig!(0xfff));
  527. assert_eq!(&0xff | ibig!(0xf0f), ibig!(0xfff));
  528. assert_eq!(&0xff | &ibig!(0xf0f), ibig!(0xfff));
  529. assert_eq!(ibig!(17) | -1, ibig!(-1));
  530. let mut x = ibig!(0xf0f);
  531. x |= 0xff;
  532. assert_eq!(x, ibig!(0xfff));
  533. let mut x = ibig!(0xf0f);
  534. x |= &0xff;
  535. assert_eq!(x, ibig!(0xfff));
  536. assert_eq!(ibig!(0xf0f) ^ 0xff, ibig!(0xff0));
  537. assert_eq!(ibig!(0xf0f) ^ &0xff, ibig!(0xff0));
  538. assert_eq!(&ibig!(0xf0f) ^ 0xff, ibig!(0xff0));
  539. assert_eq!(&ibig!(0xf0f) ^ &0xff, ibig!(0xff0));
  540. assert_eq!(0xffu8 ^ ibig!(0xf0f), ibig!(0xff0));
  541. assert_eq!(0xffu8 ^ &ibig!(0xf0f), ibig!(0xff0));
  542. assert_eq!(&0xffu8 ^ ibig!(0xf0f), ibig!(0xff0));
  543. assert_eq!(&0xffu8 ^ &ibig!(0xf0f), ibig!(0xff0));
  544. assert_eq!(ibig!(-1) ^ -1, ibig!(0));
  545. let mut x = ibig!(0xf0f);
  546. x ^= 0xff;
  547. assert_eq!(x, ibig!(0xff0));
  548. let mut x = ibig!(0xf0f);
  549. x ^= &0xff;
  550. assert_eq!(x, ibig!(0xff0));
  551. assert_eq!(ibig!(0xf0f).and_not(0xff), ibig!(0xf00));
  552. assert_eq!(ibig!(0xf0f).and_not(&0xff), ibig!(0xf00));
  553. assert_eq!((&ibig!(0xf0f)).and_not(0xff), ibig!(0xf00));
  554. assert_eq!((&ibig!(0xf0f)).and_not(&0xff), ibig!(0xf00));
  555. assert_eq!(ibig!(-13).and_not(-1), ibig!(0));
  556. }