Re: bitpack.c odditiy

"Timothy B. Terriberry" <[email protected]>
Newsgroups gmane.comp.multimedia.ogg.theora.devel
Message-ID <[email protected]>
Nils Pipenbrinck <[email protected]> wrote:

> While browsing the code I came across line 83 bitpack.c:
>
>   *_ret=((ret&0xFFFFFFFFUL)>>(m>>1))>>(m+1>>1);
>
> Is there any reason why this is so convoluted? Maybe endianess or 64 bit
> issues? If I'm not mistaken it does exactly the the same as:
>
>   *_ret = ret >> m;

Yes, there is. 64-bit issues, as you noted, require the mask. It  
should be optimized out by a 32-bit compiler. However, m can take the  
full range of values from 0 to 32. Shifting by values as large as the  
word size is not defined for ANSI C, and on Intel machines in  
particular, a shift by 32 (of a 32-bit value) is treated as a shift by  
zero (it only considers the lower 5 bits of the shift index). The  
above code correctly returns zero (i.e., it shifts off all 32 bits).
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.