diff -r 5193570b739a -r a282abb07642 src/HOL/Library/Bit_Operations.thy --- a/src/HOL/Library/Bit_Operations.thy Thu Sep 17 09:57:30 2020 +0000 +++ b/src/HOL/Library/Bit_Operations.thy Thu Sep 17 09:57:31 2020 +0000 @@ -275,6 +275,20 @@ apply (use exp_eq_0_imp_not_bit in blast) done +lemma take_bit_not_eq_mask_diff: + \take_bit n (NOT a) = mask n - take_bit n a\ +proof - + have \take_bit n (NOT a) = take_bit n (NOT (take_bit n a))\ + by (simp add: take_bit_not_take_bit) + also have \\ = mask n AND NOT (take_bit n a)\ + by (simp add: take_bit_eq_mask ac_simps) + also have \\ = mask n - take_bit n a\ + by (subst disjunctive_diff) + (auto simp add: bit_take_bit_iff bit_mask_iff exp_eq_0_imp_not_bit) + finally show ?thesis + by simp +qed + lemma mask_eq_take_bit_minus_one: \mask n = take_bit n (- 1)\ by (simp add: bit_eq_iff bit_mask_iff bit_take_bit_iff conj_commute) @@ -1111,6 +1125,11 @@ for k :: int by (auto simp add: signed_take_bit_eq_take_bit_shift take_bit_int_eq_self_iff algebra_simps) +lemma signed_take_bit_int_eq_self: + \signed_take_bit n k = k\ if \- (2 ^ n) \ k\ \k < 2 ^ n\ + for k :: int + using that by (simp add: signed_take_bit_int_eq_self_iff) + lemma signed_take_bit_int_less_eq_self_iff: \signed_take_bit n k \ k \ - (2 ^ n) \ k\ for k :: int @@ -1136,13 +1155,13 @@ lemma signed_take_bit_int_greater_eq: \k + 2 ^ Suc n \ signed_take_bit n k\ if \k < - (2 ^ n)\ for k :: int - using that take_bit_greater_eq [of \k + 2 ^ n\ \Suc n\] + using that take_bit_int_greater_eq [of \k + 2 ^ n\ \Suc n\] by (simp add: signed_take_bit_eq_take_bit_shift) lemma signed_take_bit_int_less_eq: \signed_take_bit n k \ k - 2 ^ Suc n\ if \k \ 2 ^ n\ for k :: int - using that take_bit_less_eq [of \Suc n\ \k + 2 ^ n\] + using that take_bit_int_less_eq [of \Suc n\ \k + 2 ^ n\] by (simp add: signed_take_bit_eq_take_bit_shift) lemma signed_take_bit_Suc_bit0 [simp]: