aardio 的所有按位运算符总是将操作数转换为 32 位整数(除 >>>
转为无符号 32 位整数以外,其他位运算符转为 32 位有符号整数),然后以二进制形式按位运算。
逻辑按位运算以 0 为假,1 为真。
按位运算符不支持运算符重载。
aardio 支持自定义进制数值,语法为 自定义进值 + '#' + 数值
。 因此可以用 2#101
表示二进制数 101
,按位运算符都是针对二进制数的操作,因此下面使用二进制数来演示。在实际使用时可以使用十进制数值(所有进制最终都是以二进制存储、按位运算并无区别) 。
&
#按位与运算符"&"是双目运算符。其功能是对参与运算的两数各对应的二进制位做按位与运算。只有对应的两个二进制位均为 1 时,结果位才为1 ,否则为 0。参与运算的数以补码方式出现。
示例:
import console.int;
//按位与
var b = 2#101 & 2#100 ;
//显示2#100
console.printf("2#%b",b);
|
#按位或运算符 |
是双目运算符。其功能是参与运算的两数各对应的二进制位做按位或运算。只要对应的二个二进制位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
示例:
import console.int;
//按位或
var b = 2#101 | 2#110 ;
//显示2#111
console.printf("2#%b",b);
^
#按位异或运算符 ^
是双目运算符。其功能是参与运算的两数各对应的二进制位做按位异或运算。只要对应的二个二进制位相同,结果位就为 0 ,否则为 1。参与运算的两个数均以补码出现。
示例:
import console.int;
//按位异或
var b = 2#101 ^ 2#110;
////显示2#011
console.printf("2#%b",b);
~
#按位取反运算符 ~
为单目运算符,具有右结合性。其功能是对参与运算的数的所有二进制位做按位取反运算。
例如:
import console.int;
//按位取反
var b = ~2#101;
//显示 2#11111111111111111111111111111010
console.printf("2#%b",b);
<<
#a << n
将数值 a 按位向左移动 n 位(如果 n 大于等于 32,则为 n对 32 取模结果的位数 )。左移 n 位就相当于乘以 2 的 n 次方(在没有溢出的前提下) 。
示例:
import console.int;
//按位左移
var b = 2#101 << 1;
//显示2#1010
console.printf("2#%b",b);
>>
#a >> n
将数值 a 按位向右移动 n 位(如果 n 大于等于 32,则为 n 对 32 取模结果的位数) ,保留符号位(负数保持最高位为 1 ) 。右移 n 位就相当于除以 2 的 n 次方(在没有溢出的前提下)
示例:
import console.int;
//按位右移
var b = 2#101 >>1;
//显示2#10
console.printf("2#%b",b);
>>>
#a >>> n 将数值a按位向右移动n位(如果n大于等于32,则为n对32取模结果的位数) ,不保留符号位(负数不保持最高位为1,因此右移后会变成正数)。
示例:
import console.int;
//按位无符号右移
var b = -2>>>18;
//显示 16383
console.print(b);
可以通过右移 0 位将有符号数强制转换为无符号数。
例如 -1 >>> 0
的值为 0xFFFFFFFF —— 其作用等价于 raw.convert( {int value = -1},{INT value}).value
。
不声明调用原生 API 默认会返回 32 位有符号整数,如果原 API 返回的是 32 位无符号整数,那么只要简单的将返回值 >>> 0
就可以得到原来的无符号数值了。