Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>I'm not sure if it's the best way to do it, but this could work (constraining shifts to be in the range 0-31.</p> <pre><code> public static void ShiftLeft(uint[] bitfield, int shift) { if(shift &lt; 0 || shift &gt; 31) { // handle error here return; } int len = bitfield.Length; int i = len - 1; uint prev = 0; while(i &gt;= 0) { uint tmp = bitfield[i]; bitfield[i] = bitfield[i] &lt;&lt; shift; if(i &lt; len - 1) { bitfield[i] |= (uint)(prev &amp; (1 &gt;&gt; shift) - 1 ) &gt;&gt; (32 - shift); } prev = tmp; i--; } } public static void ShiftRight(uint[] bitfield, int shift) { if(shift &lt; 0 || shift &gt; 31) { // handle error here return; } int len = bitfield.Length; int i = 0; uint prev = 0; while(i &lt; len) { uint tmp = bitfield[i]; bitfield[i] = bitfield[i] &gt;&gt; shift; if(i &gt; 0) { bitfield[i] |= (uint)(prev &amp; (1 &lt;&lt; shift) - 1 ) &lt;&lt; (32 - shift); } prev = tmp; i++; } } </code></pre> <p>PD: With this change, you should be able to handle shifts greater than 31 bits. Could be refactored to make it look a little less ugly, but in my tests, it works and it doesn't seem too bad performance-wise (unless, there's actually something built in to handle large bitsets, which could be the case).</p> <pre><code> public static void ShiftLeft(uint[] bitfield, int shift) { if(shift &lt; 0) { // error return; } int intsShift = shift &gt;&gt; 5; if(intsShift &gt; 0) { if(intsShift &gt; bitfield.Length) { // error return; } for(int j=0;j &lt; bitfield.Length;j++) { if(j &gt; intsShift + 1) { bitfield[j] = 0; } else { bitfield[j] = bitfield[j+intsShift]; } } BitSetUtils.ShiftLeft(bitfield,shift - intsShift * 32); return; } int len = bitfield.Length; int i = len - 1; uint prev = 0; while(i &gt;= 0) { uint tmp = bitfield[i]; bitfield[i] = bitfield[i] &lt;&lt; shift; if(i &lt; len - 1) { bitfield[i] |= (uint)(prev &amp; (1 &gt;&gt; shift) - 1 ) &gt;&gt; (32 - shift); } prev = tmp; i--; } } public static void ShiftRight(uint[] bitfield, int shift) { if(shift &lt; 0) { // error return; } int intsShift = shift &gt;&gt; 5; if(intsShift &gt; 0) { if(intsShift &gt; bitfield.Length) { // error return; } for(int j=bitfield.Length-1;j &gt;= 0;j--) { if(j &gt;= intsShift) { bitfield[j] = bitfield[j-intsShift]; } else { bitfield[j] = 0; } } BitSetUtils.ShiftRight(bitfield,shift - intsShift * 32); return; } int len = bitfield.Length; int i = 0; uint prev = 0; while(i &lt; len) { uint tmp = bitfield[i]; bitfield[i] = bitfield[i] &gt;&gt; shift; if(i &gt; 0) { bitfield[i] |= (uint)(prev &amp; (1 &lt;&lt; shift) - 1 ) &lt;&lt; (32 - shift); } prev = tmp; i++; } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload