Answer $a$ :
First Let's write RE for all bit strings whose value, when interpreted as a binary integer, is greater than or equal to 64 (Because it will be 7 or more than 7 bits for all these numbers in binary) : $(0+1)^*1(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)^*\,$
And Now just add strings from 40 to 63 to make RE Complete.
$(0+1)^*1(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)^*\,$ = $0^*1(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)^*\,$
Answer $b $ :
Try Dividing the Problem and then summing up all the possibilities.(Divide and Conquer)
First Let's write RE for All Bit Strings, with leading bit 1, interpreted as a binary integer, with values more than or equal to 32 (Because it will be 6 or more than 6 bits for all these numbers in binary) = $1(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)^*\,$
Now the remaining Strings in the language are : One Length, Two Length, Three Length, and Some Four length, and Some five length Strings. = $1\,+ \, 1(0+1)\,+1(0+1)(0+1)\,+1000\,+1001\,+1010\,+11110\,+11111\,$ (Assuming that "in between 10 and 30" means 10 and 30 Not Included in the Exclusion of Strings from the language)
So, The Desired RE for the language is :
$1\,+ \, 1(0+1)\,+1(0+1)(0+1)\,+1000\,+1001\,+1010\,+11110\,+11111\,+1(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)^*\,$