JavaScript
// END RESULT:
F=i=>`,${[...(65536|i).toString(2)].map((v,l,a)=>l%4==1&&`| ${a.slice(l,l+4).map(v=>" #"[v]).join` | `} |`).filter(v=>v)},`.replace(/,/g, `
+---+---+---+---+
`).slice(1)
// CHANGE HISTORY
// 0. original (buggy)
f=i=>(","+("0".repeat(16)+i.toString(2)).slice(-16).split``.map((v,l,a)=>l%4<1?"| "+a.slice(l,l+4).map(v=>-v?"#":" ").join` | `+" |":"").filter(v=>!!v).join`,`+",").replace(/,/g, `
+---+---+---+---+
`).slice(1)
// 1. original (fixed)
f=i=>(","+("0".repeat(16)+i.toString(2)).slice(-16).split``.map((v,l,a)=>l%4<1?"| "+a.slice(l,l+4).map(v=>+v?"#":" ").join` | `+" |":"").filter(v=>!!v).join`,`+",").replace(/,/g, `
+---+---+---+---+
`).slice(1)
// 2. obvious improvements:
// !!v no use in thie case, can drop !!
// join(',') is the default conversion of an array to string so can simply be dropped
// l%4<1 having l in 0..3, is !(l%4) just exchange ? and :
f=i=>(","+("0".repeat(16)+i.toString(2)).slice(-16).split``.map((v,l,a)=>l%4?"":"| "+a.slice(l,l+4).map(v=>+v?"#":" ").join` | `+" |").filter(v=>v)+",").replace(/,/g, `
+---+---+---+---+
`).slice(1)
// 3. binary conversion with leading 0s is simpler
f=i=>(","+(65536|i).toString(2).slice(1).split``.map((v,l,a)=>l%4?"":"| "+a.slice(l,l+4).map(v=>+v?"#":" ").join` | `+" |").filter(v=>v)+",").replace(/,/g, `
+---+---+---+---+
`).slice(1)
// 4. ternary with 0/1 and 1 single char -> string indexing
f=i=>(","+(65536|i).toString(2).slice(1).split``.map((v,l,a)=>l%4?"":"| "+a.slice(l,l+4).map(v=>" #"[v]).join` | `+" |").filter(v=>v)+",").replace(/,/g, `
+---+---+---+---+
`).slice(1)
// 5. playing with l index, can avoid first slice(1)
f=i=>(","+(65536|i).toString(2).split``.map((v,l,a)=>l%4==1&&"| "+a.slice(l,l+4).map(v=>" #"[v]).join` | `+" |").filter(v=>v)+",").replace(/,/g, `
+---+---+---+---+
`).slice(1)
// 6. spread operator on string instead of split
f=i=>(","+[...(65536|i).toString(2)].map((v,l,a)=>l%4==1&&"| "+a.slice(l,l+4).map(v=>" #"[v]).join` | `+" |").filter(v=>v)+",").replace(/,/g,...