#include "a_samp"
#define T<%0> a%0
enum{a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15}
main()
{
/*
Bitwise OR
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
*/
func("|", "0011", T<1> | T<2>, false); // 0001 | 0010 = 0011
func("|", "0101", T<1> | T<4>, false); // 0001 | 0100 = 0101
func("|", "0111", T<1> | T<2> | T<4>, false); // 0001 | 0010 | 0100 = 0111
func("|", "1001", T<1> | T<8>, false); // 0001 | 1000 = 1001
func("|", "1010", T<2> | T<8>, false); // 0010 | 1000 = 1010
func("|", "1011", T<1> | T<2> | T<8>, false); // 0001 | 0010 | 1000 = 1011
func("|", "1011", T<1> | T<10>, false); // 0001 | 1010 = 1011
func("|", "1101", T<8> | T<5>, false); // 1000 | 0101 = 1101
func("|", "1111", T<10> | T<5>, false); // 1010 | 0101 = 1111
//------------------------------------------------------------------------------------------------------
/*
Bitwise AND
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
*/
func("&", "0000", T<4> & T<8>, false); // 0100 & 1000 = 0000
func("&", "0001", T<1> & T<5>, false); // 0001 & 0101 = 0001
func("&", "0010", T<2> & T<10>, false); // 0010 & 1010 = 0010
func("&", "0100", T<4> & T<5>, false); // 0100 & 0101 = 0100
func("&", "1000", T<8> & T<10>, false); // 1000 & 1010 = 1000
func("&", "1010", T<10> & T<11>, false); // 1010 & 1011 = 1010
func("&", "0010", (T<10> & T<15>) & T<2>, false); // (1010 & 1111) & 0010 = 1010 & 0010 = 0010
//------------------------------------------------------------------------------------------------------
/*
Bitwise XOR
0 XOR 0 = 1
0 XOR 1 = 0
1 XOR 0 = 0
1 XOR 1 = 1
*/
func("^", "0010", T<8> ^ T<10>, false); // 1000 ^ 1010 = 0010
func("^", "0100", T<11> ^ T<15>, false); // 1011 ^ 1111 = 0100
//------------------------------------------------------------------------------------------------------
/*
Bitwise NOT
NOT 0 = 1
NOT 1 = 0
*/
func("~", "11111111111111111111111111111010", ~T<5>);
// ~00000000000000000000000000000101 = 11111111111111111111111111111010
func("~", "11111111111111111111111111110011", ~(T<4> | T<8>));
// ~(0100 | 1000) = ~00000000000000000000000000001100 = 11111111111111111111111111110011
func("~", "11111111111111111111111111110011", ~(T<5> & T<15>));
// ~(0101 & 1111) = ~00000000000000000000000000000101 = 11111111111111111111111111110011
//------------------------------------------------------------------------------------------------------
// Bitwise arithmetic shift
func("<<", "0010", T<1> << 1, false); // 0001 << 1 = 0010
func("<<", "0100", T<1> << 2, false); // 0001 << 2 = 0100
func("<<", "1000", T<1> << 3, false); // 0001 << 3 = 1000
func("<<", "1010", T<5> << 1, false); // 0101 << 1 = 1010
func(">>", "0100", T<8> >> 1, false); // 1000 >> 1 = 0100
func(">>", "0010", T<8> >> 2, false); // 0001 >> 2 = 0010
func(">>", "0001", T<8> >> 3, false); // 0001 >> 3 = 0001
func(">>", "0101", T<10> >> 1, false); // 1010 >> 1 = 0101
/*
Attention, if you use the bit right shift and the 32th bit is 1 (so a value negative),
the bits will not shift, but will be added.
Example, you think that this operation will give this result ? :
11111111111111111111111111111000 (-8) >> 2 = 00111111111111111111111111111110 (1073741822)
But no, this operation will give this result :
11111111111111111111111111111000 (-8) >> 2 = 11111111111111111111111111111110 (-2)
Conclusion, when you use the bit right shift on negative value, it remains negative.
*/
func(">>", "11111111111111111111111111111110", 0b11111111111111111111111111111000 >> 2);
//------------------------------------------------------------------------------------------------------
/*
Bitwise logical shift
If you understood the explanations before for the bit right shift, there is solution
to shift to the right on a negative value with the bit logical shift operator.
Let us take the example of before :
11111111111111111111111111111000 (-8) >> 2 = 00111111111111111111111111111110 (1073741822)
It is false, but if I use the bit logical shift operator :
11111111111111111111111111111000 (-8) >>> 2 = 00111111111111111111111111111110 (1073741822)
This is true.
You are wondering if there is the bit logical shift "left" ? In Pawn : no.
That's why when we say "bit logical shift", we don't mention the "direction",
because there only the right.
*/
func(">>>", "00111111111111111111111111111110", 0b11111111111111111111111111111000 >>> 2);
}
func(const o[], const str[], value, bool:b32 = true)
{
static
n = 1;
if(b32)
{
printf("________________________________%03d (%s)", n, o);
print(str);
printf("%032b", value);
print("¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯");
}
else
{
printf("____%03d (%s)", n, o);
print(str);
printf("%04b", value);
print("¯¯¯¯");
}
n++;
}
Comments
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎