Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Побитовое ИЛИ


Автор: DissDoc 4.5.2009, 13:30
Может не совсем точно тема стоит. Попробую описать то, чего хочу. 
Частенько встречаю конструкцию функций типа TEST|NO_TEST, т.е. можно написать в функцию параметр вот так
Код

func_test(TEST);
func_test(TEST|NO_TEST);

И например в первом случае выведет строку test, а во втором test with no test.
И вопрос - как это реализуется?

P.S. ох, надеюсь понятно ((

Автор: ivg 4.5.2009, 13:53
Код

public class Test {

    public static final int TEST = 0x1;
    public static final int NO_TEST = 0x2;
    public static final int NOTNOW_TEST = 0x4;

    public static void main(String[] args) {
        func_test(TEST);
        func_test(TEST | NO_TEST);
    }

    public static void func_test(int flag) {
        StringBuilder sb = new StringBuilder();
        if ((flag & TEST) != 0)
            sb.append("test");
        if ((flag & NO_TEST) != 0) {
            conjunction(sb);
            sb.append("no test");
        }
        if ((flag & NOTNOW_TEST) != 0) {
            conjunction(sb);
            sb.append("future test");
        }
        System.out.println(sb.toString());
    }
    
    private static void conjunction(StringBuilder sb) {
        if (sb.length() > 0)
            sb.append(" with ");
    }
}

Автор: DissDoc 4.5.2009, 14:07
Один только вопрос - не понятны значения 0х1, 0х2, 0х4 и их зависимость друг от друга =\

Автор: NeoNYura 4.5.2009, 14:20
ivg


а в  блоках if разве не XOR должен быть? (^)

Автор: ivg 4.5.2009, 14:21
0xHexDigits - целое число в hex-формате. Можно было бы написать 1, 2, 4, 8, 16 и т.д. Соответствуют взведённому биту в двоичном представлении. Остальное наверное понятно, судя по названию темы.

Автор: JVMan 4.5.2009, 14:21
Цитата(DissDoc @ 4.5.2009,  14:07)
Один только вопрос - не понятны значения 0х1, 0х2, 0х4 и их зависимость друг от друга =\

Это битовые маски.

Т.е например
0X1 - ...001
0Х2 - ...010
0х4 - ...100

Автор: ivg 4.5.2009, 14:22
Цитата(NeoNYura @  4.5.2009,  16:20 Найти цитируемый пост)
а в  блоках if разве не XOR должен быть? (^)

Например?

Автор: NeoNYura 4.5.2009, 14:29
ivg
не правильно посмотрел, извиняюсь

Автор: pompei 4.5.2009, 14:31
Смотрим по двоичному представлению чисел...
Код

1 -> 0x1 -> 0000 0001 - *
2 -> 0x2 -> 0000 0010 - *
3 -> 0x3 -> 0000 0011
4 -> 0x4 -> 0000 0100 - *
5 -> 0x5 -> 0000 0101
6 -> 0x6 -> 0000 0110
7 -> 0x7 -> 0000 0111
8 -> 0x8 -> 0000 1000 - *
9 -> 0x9 -> 0000 1001
10 -> 0xA -> 0000 1010
11 -> 0xB -> 0000 1011
12 -> 0xC -> 0000 1100
13 -> 0xD -> 0000 1101
14 -> 0xE -> 0000 1110
15 -> 0xF -> 0000 1111
16 -> 0x10 -> 0001 0000 - *
17 -> 0x11 -> 0001 0001
...
32 -> 0x20 -> 0010 0000 - *
...
64 -> 0x40 -> 0100 0000 - *
...

* - используем это число, потому что одна "1"


Теперь только с теми которые со свёздочками (*)
(Операцию нужно проводить с каждым битом: TRUE=1, FALSE=0, | - или, & - и)
Код

2 | 8 -> 0000 1010

(2 | 8) & 1 -> 0000 0000 == 0

(2 | 8) & 2 -> 0000 0010 -> 2 > 0

(2 | 8) & 4 -> 0000 0000 == 0

(2 | 8) & 8 -> 0000 1000 -> 4 > 0

(2 | 8) & 16 -> 0000 0000 == 0


Автор: DissDoc 5.5.2009, 09:07
Ох как все разжевали! Разобрался!
 smile Спасибо всем за внимание.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)