diff --git a/libcelt/bands.c b/libcelt/bands.c
index 68ba697725caf560e5a3f10b4f4979e761510220..20b93b969bcd3909a440c5cac19a78c1cfec34ce 100644
--- a/libcelt/bands.c
+++ b/libcelt/bands.c
@@ -705,11 +705,14 @@ static unsigned quant_band(int encode, const CELTMode *m, int i, celt_norm *X, c
 
       for (k=0;k<recombine;k++)
       {
+         static const unsigned char bit_interleave_table[16]={
+           0,1,1,1,2,3,3,3,2,3,3,3,2,3,3,3
+         };
          if (encode)
             haar1(X, N>>k, 1<<k);
          if (lowband)
             haar1(lowband, N>>k, 1<<k);
-         fill |= fill<<(1<<k);
+         fill = bit_interleave_table[fill&0xF]|bit_interleave_table[fill>>4]<<2;
       }
       B>>=recombine;
       N_B<<=recombine;
@@ -1126,7 +1129,11 @@ static unsigned quant_band(int encode, const CELTMode *m, int i, celt_norm *X, c
 
          for (k=0;k<recombine;k++)
          {
-            cm |= cm<<(1<<k);
+            static const unsigned char bit_deinterleave_table[16]={
+              0x00,0x03,0x0C,0x0F,0x30,0x33,0x3C,0x3F,
+              0xC0,0xC3,0xCC,0xCF,0xF0,0xF3,0xFC,0xFF
+            };
+            cm = bit_deinterleave_table[cm];
             haar1(X, N0>>k, 1<<k);
          }
          B<<=recombine;