For a direct mapped cache the general rule is: first figure out the bits of the offset (the right-most bits of the address), then figure out the bits of the index (the next-to right-most address bits), and then the tag is everything left over (on the left side).
One way to think of a direct mapped cache is as a table with rows and columns. The index tells you what row to look at, then you compare the tag for that row, and if it matches, the offsettells you which column to use. (Note that the order you use the parts: index/tag/offset, is different than the order in which you figure out which bits are which: offset/index/tag.)
So in part (a) The block size is 1 word, so you need 0 offset bits (because <span><span><span>20</span>=1</span><span><span>20</span>=1</span></span>). You have 16 blocks, so you need 4 index bits to give 16 different indices (because <span><span><span>24</span>=16</span><span><span>24</span>=16</span></span>). That leaves you with the remaining 28 bits for the tag. You seem to have gotten this mostly right (except for the rows for "180" and "43" where you seem to have missed a few bits, and the row for "181" where you interchanged some bits when converting to binary, I think). You are correct that everything is a miss.
For part (b) The block size is 2 words, so you need 1 offset bit (because <span><span><span>21</span>=2</span><span><span>21</span>=2</span></span>). You have 8 blocks, so you need 3 index bits to give 8 different row indices (because <span><span><span>23</span>=8</span><span><span>23</span>=8</span></span>). That leaves you with the remaining 28 bits for the tag. Again you got it mostly right except for the rows for "180" and "43" and "181". (Which then will change some of the hits and misses.)