]> source.dussan.org Git - sonarqube.git/blob
ac5108fedbf698c648d0bb32cec5d9260306c3cb
[sonarqube.git] /
1 <p> Loads a value from a byte array and performs a bitwise OR with
2 that value. Values loaded from a byte array are sign extended to 32 bits
3 before any any bitwise operations are performed on the value.
4 Thus, if <code>b[0]</code> contains the value <code>0xff</code>, and
5 <code>x</code> is initially 0, then the code 
6 <code>((x &lt;&lt; 8) | b[0])</code>  will sign extend <code>0xff</code>
7 to get <code>0xffffffff</code>, and thus give the value
8 <code>0xffffffff</code> as the result.
9 </p>
10
11 <p>In particular, the following code for packing a byte array into an int is badly wrong: </p>
12 <pre>
13 int result = 0;
14 for(int i = 0; i &lt; 4; i++) 
15   result = ((result &lt;&lt; 8) | b[i]);
16 </pre>
17
18 <p>The following idiom will work instead: </p>
19 <pre>
20 int result = 0;
21 for(int i = 0; i &lt; 4; i++) 
22   result = ((result &lt;&lt; 8) | (b[i] &amp; 0xff));
23 </pre>