бит манипуляции с использованием Int в Java - PullRequest
1 голос
/ 02 ноября 2011

У меня есть int, и я хочу инвертировать его биты, используя оператор ~ bit.Это должно быть очень просто сделать, однако я пытался, и это не работает.Я полагаю, что это потому, что Java использует два дополнения, чтобы представить его int.Так какой же самый эффективный способ сделать это?50 при инвертировании должно быть 13, и это значение, которое я хотел бы иметь

Ответы [ 3 ]

2 голосов
/ 02 ноября 2011

Кажется, вы хотите только часть побитового дополнения до самого значительного установленного бита ввода. Тогда вам просто нужно замаскировать комплимент,

int invert(int n) {
    return ~n & mask(n);
}
int mask(int n) {
    n |= n >> 1;
    n |= n >> 2;
    n |= n >> 4;
    n |= n >> 8;
    return n | (n >> 16);
}
0 голосов
/ 02 ноября 2011

Java int имеет длину 32 бита, для знака используется 1 бит.Следовательно, 50 представляется в двоичном виде как 00000000000000000000000000110010.Если вы инвертируете это по битам, вы получите 11111111111111111111111111001101, то есть целое значение java -51 в десятичной записи.

0 голосов
/ 02 ноября 2011

Поскольку int должен иметь ширину не менее 32 бит, ~ 50 определенно не равно 13. Я думаю, вы предполагаете, что int имеет ширину всего 8 бит, что, возможно, имело место около 237 лет назад, но определенно не в наши дни и не на Яве, во всяком случае. Если вам нужен тип данных с гарантированной шириной 8 бит, используйте byte.

Но даже тогда ~ 50 - это не 13, только если принять во внимание младшие 6 бит. Но все это не имеет ничего общего с дополнением до двух.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...