I get the same thing as you, and I get the same thing when I have "return 0." The puzzle is annoying.
For what it's worth, here's my answer: 1>>(x&~(~x+1))&~(1>>x) . (I didn't figure out that the tester was broken before I developed my answer.)
I tested it with positive integers on Python. I haven't tried it with negatives in Javascript.
The '(x&~(~x+1))' is a work-around to get 'x&(x-1)', which is 0 if x is a power of two. The (1>> value) is a workaround to get "value == 0". Thus, '1>>(x&~(~x+1))' means 'is x a power of two?'
The ~(1>>x) means 'is x == 0'. Combine the two together gives 1 if a single bit is set, else 0.
That's not it. For example, it accepts "return x|x&x;" . The restriction is that only a handful of Javascript operations are allowed. Anything else gives a hard-to-understand error message.
This is stated to be a puzzle. But, when does this actually get used? Are there use cases of bit manipulation in JS? I've never understood when using bit operators could be necessary or even useful. Of course, I'm speaking from my experience building web apps; ruby, python, js, php, etc. I don't have much other programming experience
The only time I find myself using bit manipulations in production code is when I am writing a library that uses an int to represent a set of option flags (where each bit is a boolean flag). It's pretty common in C libs to define some constants like
int FLAG_1 = 1;
int FLAG_2 = 2;
int FLAG_3 = 4; //These would actually probably be formatted like (1 << N)
...
And then pass in your options to a function like f(... FLAG_1+FLAG_2) so you can have an optional number of flags in a single argument.
The first time I used bit manipulation in web apps was for declaring user roles and permissions. A single integer field in your database can be used to declare any combination of up to 32 different capabilities/permissions for users by setting the individual bits in the value. Also, when dealing with colors as an integer value, you can isolate your ARGB values using bit shifting.
To do this exercise in javascript is pretty silly. But as a systems developer, I can tell you that bit manipulation happens all over the place in my line of work.
This is mostly done in lower level code, so no wonder you have never bumped into it. One easy example, though is passing a set of binary options around, which is useful, for example, when you want to say "enable those features, and disable those other features". You can pack up to 32 options into a 4-byte integer.
Embedded applications use bitwise ops all the time. Particularly for performing changes to registers.
Example, a microcontroller has an 8 bit status register. Each bit controls some hardware function. You wish to change bit 5, but you can't change anything else because it would cause unwanted side effects. So this rules out simply saying myregister = 0b00001000.
Common solution is to make a macro like:
#define setbit(BYTE,BIT) BYTE |= (1 << BIT)
Thus you can say I want to set bit 5 in my register by calling setbit(foo, 5) while keeping the rest of the byte intact. There are analogous macros for clearing and toggling bits.
Or you might want to perform an operation based on a particular bit in a byte, e.g. byte 5 is a status flag that tells you when a timer has overflowed.
That would work if the `>>>` operator worked as expected, but actually it just looks at the first 5 bits of the second variable so that `a>>>b` is effectively equivalent to `a>>>(b&31)`. His description of it is wrong.
That will get fairly hairy, given that JavaScript doesn't have integers. x should be expected to be a IEEE 754 double (can one discriminate between NaNs in JavaScript?), but might also be a string (does "@" have one bit set?, or might it be EBCDIC?), an array, an object, null or undefined (do those have a bit pattern?)
Because of that, I am not sure can use them to count the number of 1 bits in a JavaScript number. For example, if x&0xFFFFFFFF equals 356621, what do you know of x?
31 comments
[ 4.6 ms ] story [ 56.6 ms ] threadJust tried doing "return 1" and still got
For what it's worth, here's my answer: 1>>(x&~(~x+1))&~(1>>x) . (I didn't figure out that the tester was broken before I developed my answer.)
I tested it with positive integers on Python. I haven't tried it with negatives in Javascript.
The '(x&~(~x+1))' is a work-around to get 'x&(x-1)', which is 0 if x is a power of two. The (1>> value) is a workaround to get "value == 0". Thus, '1>>(x&~(~x+1))' means 'is x a power of two?'
The ~(1>>x) means 'is x == 0'. Combine the two together gives 1 if a single bit is set, else 0.
function one_bit(x) { return x & (x-1) == 0 ? 1 : 0; }
Oops, i'll fix it.
- Interacting with hardware that uses certain bits in a register to control behavior - for example, Arduino digital ports [2]
- Doing arithmetic extra-fast with numbers that are powers of two - modulo becomes bitwise-and, division and multiplication become shifts
[1] http://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_pale...
[2] http://arduino.cc/en/Reference/PortManipulation
Example, a microcontroller has an 8 bit status register. Each bit controls some hardware function. You wish to change bit 5, but you can't change anything else because it would cause unwanted side effects. So this rules out simply saying myregister = 0b00001000.
Common solution is to make a macro like:
#define setbit(BYTE,BIT) BYTE |= (1 << BIT)
Thus you can say I want to set bit 5 in my register by calling setbit(foo, 5) while keeping the rest of the byte intact. There are analogous macros for clearing and toggling bits.
Or you might want to perform an operation based on a particular bit in a byte, e.g. byte 5 is a status flag that tells you when a timer has overflowed.
#define getbit(BYTE, BIT) !!(BYTE & ~(1 << BIT))
Then you can say:
if( getbit(myregister, 5)){ // do something }
Fun fun :)
The best I could come up with is:
function one_bit(x) { return 1 >>> (x & (x + ~0)) }
("x + ~0" is equivalent to "x - 1")
But this doesn't work when x is 0 All other case should be fine, afaik.
http://jsfiddle.net/Ayzkt/2/
https://gist.github.com/anonymous/8364074