Ok, I might be understanding this differently then:

The -1 * x operation cannot be defined for unsigned integers as -1
overflows. Therefore, -x in the case of unsigned types is interpreted
differently by the compiler, resulting in a ^x + 1 operation. Is that a
correct assumption?

By the way, yes, the title should say Bit instead of Byte, sorry about the
confusion.

On Wed, Jul 26, 2017 at 11:35 AM, Matt Harden <matt.har...@gmail.com> wrote:

> Both statements are true for both signed and unsigned integers.
>
> On Mon, Jul 24, 2017, 04:11 Pablo Rozas Larraondo <
> p.rozas.larrao...@gmail.com> wrote:
>
>> Thanks Bakul, I think I have a better understanding of what's going on
>> after reading your response.
>>
>> Is it correct to say that the Go compiler treats the prepended minus sign
>> differently depending on the variable being a signed or an unsigned
>> integer?
>>
>> By looking at this example: https://play.golang.org/p/feqQsuPkqk
>>
>> It seems to me that in the case of an unsigned integer it's treated as a
>> bitwise operation : -x == ^x + 1
>> But for signed integers -x == -1 * x
>>
>> Cheers,
>> Pablo
>>
>>
>>
>> On Mon, Jul 24, 2017 at 5:36 AM, Bakul Shah <ba...@bitblocks.com> wrote:
>>
>>> This is a standard trick to find the least significant set bit in a
>>> word. Only works for 2's complement numbers!
>>>     -x == ~x+1
>>> For example: x = 00110000b (24), ~x+1 = 11001111+1 = 11010000. Adding
>>> them yields 00010000; thus only the least significant set bit remains set.
>>>
>>> Note that func LSB(x uint64) uint64 { return x&-x } works too. In your
>>> example you get an error because in Go literal constants are untyped. It is
>>> a pragmatic decision -- see https://blog.golang.org/constants
>>>
>>> On Jul 23, 2017, at 5:50 AM, Pablo Rozas Larraondo <
>>> p.rozas.larrao...@gmail.com> wrote:
>>>
>>> I have seen Go code using this function to find out the least
>>> significant byte of unsigned integers:
>>>
>>> func LSB(ci uint64) uint64 { return uint64(ci) & -uint64(ci) }
>>>
>>> This function works fine but I wonder why, if call the same AND
>>> operation, it results in an error: "constant -X overflows uint64"
>>>
>>> Here is a playground example to illustrate this:
>>> https://play.golang.org/p/_0EYtlLnmG
>>>
>>> Does anyone know what changes when -uint64() is called in a return
>>> statement? How a negative uint should be interpreted?
>>>
>>> Thank you,
>>> Pablo
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to golang-nuts+unsubscr...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to golang-nuts+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to