RFR : 8221696: MappedByteBuffer.force method to specify range

Andrew Haley aph at redhat.com
Tue May 14 09:57:33 UTC 2019


On 5/13/19 5:14 PM, Andrew Dinn wrote:
> Thank you for looking at the patch.
> 
> On 28/04/2019 18:09, Andrew Haley wrote:
>> On 4/25/19 5:34 PM, Andrew Dinn wrote:
>>>    long map_base = (address & ~(ps - 1));
>>
>> This looks like a hard way to write
>>
>>    long map_base = address & -ps;
> 
> My version certainly uses more characters, that is for sure. However, I 
> chose (and still prefer) this form for /clarity/. It seems to me to 
> communicate as simply as possible what mask is being constructed, 
> granted the starting premise that ps is a power of 2 (i.e. has only a 
> single bit set).
> 
> It only requires elementary knowledge of binary representations to see:
> 
>    firstly, that ps-1 clears the original bit and sets all lower bits;

I think your core argument fails at this point. You have *already*
moved to considering a bitwise transformation as arithmetic.

>    next that ~(ps-1) clears those lower bits and sets all bits from the 
> original (inclusive) upwards;
> 
>    then that the result can be used as a mask to clear those same bottom 
> bits from address;
> 
>    finally that this mask operation is equivalent to rounding down to 
> the relevant power of two.
> 
> I find your alternative (a tad) less clear because it employs an 
> arithmetic operation to achieve the requisite bitwise transformation. 

So does yours. See above.

> That the two expressions compute to equivalent results requires some 
> experience and understanding of the twos-complement representations of 
> numbers rather than basic knowledge of bit fields.
> 
> As a gcc hacker 'your mileage may vary' ;-)
> 
> Crucially, every compiler we rely on is going to produce the same code 
> in both cases.

It helps a lot to think of the operation as sign extending the most
significant bit. This clears up the confusion and removes the need for
the obfuscation, I think.

Still, it's not worth arguing about. You've at least thought about it.

-- 
Andrew Haley
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
https://keybase.io/andrewhaley
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671


More information about the core-libs-dev mailing list