6 theory Bit_Operations |
6 theory Bit_Operations |
7 imports |
7 imports |
8 "HOL-Library.Boolean_Algebra" |
8 "HOL-Library.Boolean_Algebra" |
9 Main |
9 Main |
10 begin |
10 begin |
11 |
|
12 subsection \<open>Preliminiaries\<close> \<comment> \<open>TODO move\<close> |
|
13 |
|
14 lemma take_bit_int_less_exp: |
|
15 \<open>take_bit n k < 2 ^ n\<close> for k :: int |
|
16 by (simp add: take_bit_eq_mod) |
|
17 |
|
18 lemma take_bit_Suc_from_most: |
|
19 \<open>take_bit (Suc n) k = 2 ^ n * of_bool (bit k n) + take_bit n k\<close> for k :: int |
|
20 by (simp only: take_bit_eq_mod power_Suc2) (simp_all add: bit_iff_odd odd_iff_mod_2_eq_one zmod_zmult2_eq) |
|
21 |
|
22 lemma take_bit_greater_eq: |
|
23 \<open>k + 2 ^ n \<le> take_bit n k\<close> if \<open>k < 0\<close> for k :: int |
|
24 proof - |
|
25 have \<open>k + 2 ^ n \<le> take_bit n (k + 2 ^ n)\<close> |
|
26 proof (cases \<open>k > - (2 ^ n)\<close>) |
|
27 case False |
|
28 then have \<open>k + 2 ^ n \<le> 0\<close> |
|
29 by simp |
|
30 also note take_bit_nonnegative |
|
31 finally show ?thesis . |
|
32 next |
|
33 case True |
|
34 with that have \<open>0 \<le> k + 2 ^ n\<close> and \<open>k + 2 ^ n < 2 ^ n\<close> |
|
35 by simp_all |
|
36 then show ?thesis |
|
37 by (simp only: take_bit_eq_mod mod_pos_pos_trivial) |
|
38 qed |
|
39 then show ?thesis |
|
40 by (simp add: take_bit_eq_mod) |
|
41 qed |
|
42 |
|
43 lemma take_bit_less_eq: |
|
44 \<open>take_bit n k \<le> k - 2 ^ n\<close> if \<open>2 ^ n \<le> k\<close> and \<open>n > 0\<close> for k :: int |
|
45 using that zmod_le_nonneg_dividend [of \<open>k - 2 ^ n\<close> \<open>2 ^ n\<close>] |
|
46 by (simp add: take_bit_eq_mod) |
|
47 |
|
48 |
11 |
49 subsection \<open>Bit operations\<close> |
12 subsection \<open>Bit operations\<close> |
50 |
13 |
51 class semiring_bit_operations = semiring_bit_shifts + |
14 class semiring_bit_operations = semiring_bit_shifts + |
52 fixes "and" :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close> (infixr \<open>AND\<close> 64) |
15 fixes "and" :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close> (infixr \<open>AND\<close> 64) |