Compile error… what's wrong?

Feb 19, 2009 at 5:55pm

Compile error… what's wrong?

I’m using some bitwise operators that would be dead simple in plain-vanilla C but that generate compile errors in Java. I understand that Java does some things differently than C, but I’m puzzled about this one. Although I’ve found an alternative way to do what I need, can anyone explain what’s going on?

I write:

——–
byte statusByte = buf[kPMHeaderLen + 2];
// buf is a byte[], the index is in range, all is well

outlet(4, (statusByte & 0×08) ? 3 : 0);
// Looks OK to me.
// Believe it or not, it does something useful.
——–

The mxj Java compiler responds, however:

/Applications/MaxMSP 4.6/Cycling ’74/java/classes/seitecIPMasterPollState.java[ 202 ] incompatible types
found : int
required: boolean

outlet(4, (statusByte & 0×08) ? 3 : 0);
………………….^

[The carat appears under the ampersand with a monospace font.]

What is wrong with using a bitwise AND in this context? I can see the compiler says it wants a boolean, but if you can’t do bitwise operations on any integer type, I’m left wondering just what the operator is good for in Java.

FWIW, this is with Max/MSP 4.6.3, Mac OS 10.5.6, JavaVM 12.0.2. Anything else worth knowing?

As well as examing bit 3, in real life I need to check bits 3, 2, and 1. In C I would do it as above. What’s the most idiomatic Java way do to this stuff?

#42403
Feb 19, 2009 at 7:14pm

I have NO idea if this is on the right track – totally guessing — perhaps
you have to create a Byte as opposed to a byte, and operate on that?

Dan

On 2/19/09 12:55 PM, “Peter Castine”

wrote:

>
> I’m using some bitwise operators that would be dead simple in plain-vanilla C
> but that generate compile errors in Java. I understand that Java does some
> things differently than C, but I’m puzzled about this one. Although I’ve found
> an alternative way to do what I need, can anyone explain what’s going on?
>
> I write:
>
> ——–
> byte statusByte = buf[kPMHeaderLen + 2];
> // buf is a byte[], the index is in range, all is well
>
> outlet(4, (statusByte & 0×08) ? 3 : 0);
> // Looks OK to me.
> // Believe it or not, it does something useful.
> ——–
>
> The mxj Java compiler responds, however:
>
> /Applications/MaxMSP 4.6/Cycling
> ’74/java/classes/seitecIPMasterPollState.java[ 202 ] incompatible types
> found : int
> required: boolean
>
>
> outlet(4, (statusByte & 0×08) ? 3 : 0);
> ………………….^
>
> [The carat appears under the ampersand with a monospace font.]
>
> What is wrong with using a bitwise AND in this context? I can see the compiler
> says it wants a boolean, but if you can’t do bitwise operations on any integer
> type, I’m left wondering just what the operator is good for in Java.
>
> FWIW, this is with Max/MSP 4.6.3, Mac OS 10.5.6, JavaVM 12.0.2. Anything else
> worth knowing?
>
> As well as examing bit 3, in real life I need to check bits 3, 2, and 1. In C
> I would do it as above. What’s the most idiomatic Java way do to this stuff?
>
>
> –
> —-
> Peter Castine
> Litter Power: < http://www.bek.no/~pcastine/Litter/>
> iCE Tools: <
http://www.dspaudio.com/software/ice/ice_overview.php>


Dan Nigrin – Defective Records
202 Hack / PC-1600 User / VSTi Host / Jack OS X / Major Malfunction
http://defectiverecords.com

http://jackosx.com

#151793
Feb 19, 2009 at 7:17pm

Nope, that wasn’t it – but it seems like you can only do bitwise operations
on ints:

http://www.herongyang.com/java/Byte-Data-Type-Bitwise-Operations.html

Dan

On 2/19/09 12:55 PM, “Peter Castine”

wrote:

>
> I’m using some bitwise operators that would be dead simple in plain-vanilla C
> but that generate compile errors in Java. I understand that Java does some
> things differently than C, but I’m puzzled about this one. Although I’ve found
> an alternative way to do what I need, can anyone explain what’s going on?
>
> I write:
>
> ——–
> byte statusByte = buf[kPMHeaderLen + 2];
> // buf is a byte[], the index is in range, all is well
>
> outlet(4, (statusByte & 0×08) ? 3 : 0);
> // Looks OK to me.
> // Believe it or not, it does something useful.
> ——–
>
> The mxj Java compiler responds, however:
>
> /Applications/MaxMSP 4.6/Cycling
> ’74/java/classes/seitecIPMasterPollState.java[ 202 ] incompatible types
> found : int
> required: boolean
>
>
> outlet(4, (statusByte & 0×08) ? 3 : 0);
> ………………….^
>
> [The carat appears under the ampersand with a monospace font.]
>
> What is wrong with using a bitwise AND in this context? I can see the compiler
> says it wants a boolean, but if you can’t do bitwise operations on any integer
> type, I’m left wondering just what the operator is good for in Java.
>
> FWIW, this is with Max/MSP 4.6.3, Mac OS 10.5.6, JavaVM 12.0.2. Anything else
> worth knowing?
>
> As well as examing bit 3, in real life I need to check bits 3, 2, and 1. In C
> I would do it as above. What’s the most idiomatic Java way do to this stuff?
>
>
> –
> —-
> Peter Castine
> Litter Power: < http://www.bek.no/~pcastine/Litter/>
> iCE Tools: <
http://www.dspaudio.com/software/ice/ice_overview.php>


Dan Nigrin – Defective Records
202 Hack / PC-1600 User / VSTi Host / Jack OS X / Major Malfunction
http://defectiverecords.com

http://jackosx.com

#151794
Feb 19, 2009 at 7:20pm

Hello Peter,

I’m not in a position to test this at the mo, but the issue might be
with having an int before the ‘?’. That is, you might have to explicitly
say:
(w & x == 0) ? y : z

Which is the sort of thing that irritates C people about Java, and makes
Java people quiver in fear about C :)


O

Peter Castine wrote:
> I’m using some bitwise operators that would be dead simple in
> plain-vanilla C but that generate compile errors in Java. I
> understand that Java does some things differently than C, but I’m
> puzzled about this one. Although I’ve found an alternative way to do
> what I need, can anyone explain what’s going on?
>

#151795
Feb 19, 2009 at 7:20pm

It’s complaining that the whole (statusByte & 0×08) results in an int,
but you need a boolean for the test.

outlet(4, (statusByte & 0×08) != 0 ? 0 : 3);

On Thu, Feb 19, 2009 at 06:55:54PM +0100, Peter Castine wrote:
>
> I’m using some bitwise operators that would be dead simple in plain-vanilla C but that generate compile errors in Java. I understand that Java does some things differently than C, but I’m puzzled about this one. Although I’ve found an alternative way to do what I need, can anyone explain what’s going on?
>
> I write:
>
> ——–
> byte statusByte = buf[kPMHeaderLen + 2];
> // buf is a byte[], the index is in range, all is well
>
> outlet(4, (statusByte & 0×08) ? 3 : 0);
> // Looks OK to me.
> // Believe it or not, it does something useful.
> ——–
>
> The mxj Java compiler responds, however:
>
> /Applications/MaxMSP 4.6/Cycling ’74/java/classes/seitecIPMasterPollState.java[ 202 ] incompatible types
> found : int
> required: boolean
>
>
> outlet(4, (statusByte & 0×08) ? 3 : 0);
> ………………….^
>
> [The carat appears under the ampersand with a monospace font.]
>
> What is wrong with using a bitwise AND in this context? I can see the compiler says it wants a boolean, but if you can’t do bitwise operations on any integer type, I’m left wondering just what the operator is good for in Java.
>
> FWIW, this is with Max/MSP 4.6.3, Mac OS 10.5.6, JavaVM 12.0.2. Anything else worth knowing?
>
> As well as examing bit 3, in real life I need to check bits 3, 2, and 1. In C I would do it as above. What’s the most idiomatic Java way do to this stuff?
>
>
> –
> —-
> Peter Castine
> Litter Power: < http://www.bek.no/~pcastine/Litter/>
> iCE Tools: <
http://www.dspaudio.com/software/ice/ice_overview.php>

#151796
Feb 19, 2009 at 11:54pm

I concur ;-) In C, as you know, this would work, in Java it needs to be something that can be converted to boolean state so you need to help it for that purpose.

Cheers,
ej

#151797
Feb 20, 2009 at 12:04am

Quote: owen wrote on Thu, 19 February 2009 20:20
—————————————————-
> I’m not in a position to test this at the mo, but the issue might be
> with having an int before the ‘?’. That is, you might have to explicitly
> say:
> (w & x == 0) ? y : z
>
> Which is the sort of thing that irritates C people about Java, and makes
> Java people quiver in fear about C :)
—————————————————-

If that’s what it is, I could live with it. I grew up with Pascal-style typechecking and am still not entirely comfortable with C’s casual use of integers where there *ought* to be a boolean.

OTOH, I’ve gotten used to it enough to use the idiom in the context of (x ? y : z) statements, which are an infernal C idiosyncrasy anyway.

But if that’s it, I wonder why the error message seemed to flag the ampersand, and not the end of the integer expression. I’ll try tomorrow.

#151798

You must be logged in to reply to this topic.