# 按位运算符

aardio 的所有按位运算符总是将操作数转换为 32 位整数(除 `>>>` 转为无符号 32 位整数以外，其他位运算符转为 32 位有符号整数)，然后以二进制形式按位运算。

逻辑按位运算以 0 为假，1 为真。

按位运算符不支持运算符重载。  

aardio 支持自定义进制数值，语法为　`自定义进值 + '#' + 数值`。 因此可以用 `2#101` 表示二进制数 `101`，按位运算符都是针对二进制数的操作，因此下面使用二进制数来演示。在实际使用时可以使用十进制数值(所有进制最终都是以二进制存储、按位运算并无区别) 。


## 按位与: `&` <a id="and" href="#and">&#x23;</a>


按位与运算符"&"是双目运算符。其功能是对参与运算的两数各对应的二进制位做按位与运算。只有对应的两个二进制位均为 1 时，结果位才为1 ，否则为 0。参与运算的数以补码方式出现。  

示例：

```aardio
import console.int; 

//按位与
var b = 2#101 & 2#100 ; 

//显示2#100
console.printf("2#%b",b); 
```  
  
## 按位或: `|` <a id="or" href="#or">&#x23;</a>


按位或运算符 `|` 是双目运算符。其功能是参与运算的两数各对应的二进制位做按位或运算。只要对应的二个二进制位有一个为1时，结果位就为1。参与运算的两个数均以补码出现。  

示例：

```aardio
import console.int; 

//按位或
var b = 2#101 | 2#110 ; 

//显示2#111
console.printf("2#%b",b); 
```   

## 按位异或: `^`  <a id="xor" href="#xor">&#x23;</a>


按位异或运算符 `^` 是双目运算符。其功能是参与运算的两数各对应的二进制位做按位异或运算。只要对应的二个二进制位相同，结果位就为 0 ,否则为 1。参与运算的两个数均以补码出现。  

示例：

```aardio
import console.int; 

//按位异或
var b = 2#101 ^ 2#110; 

////显示2#011
console.printf("2#%b",b); 
``` 

## 按位取反: `~` <a id="not" href="#not">&#x23;</a>


按位取反运算符 `~` 为单目运算符，具有右结合性。其功能是对参与运算的数的所有二进制位做按位取反运算。  

例如:  

```aardio
import console.int; 

//按位取反
var b = ~2#101; 

//显示 2#11111111111111111111111111111010
console.printf("2#%b",b); 
```  

## 按位左移: `<<` <a id="left-shift" href="#left-shift">&#x23;</a>


`a << n `将数值 a 按位向左移动 n 位(如果 n 大于等于 32，则为 n对 32 取模结果的位数 )。左移 n 位就相当于乘以 2 的 n 次方(在没有溢出的前提下) 。  

示例：

```aardio
import console.int; 

//按位左移
var b = 2#101 << 1;  

//显示2#1010
console.printf("2#%b",b); 
``` 

## 按位右移: `>>`  <a id="right-shift" href="#right-shift">&#x23;</a>


`a >> n` 将数值 a 按位向右移动 n 位(如果 n 大于等于 32，则为 n 对 32 取模结果的位数) ，保留符号位(负数保持最高位为 1 )  。右移 n 位就相当于除以 2 的 n 次方(在没有溢出的前提下)  

示例：

```aardio
import console.int; 

//按位右移
var b = 2#101 >>1;  

//显示2#10
console.printf("2#%b",b); 
``` 

## 按位无符号右移: `>>>` <a id="unsigned-right-shift" href="#unsigned-right-shift"">&#x23;</a>


> a >>> n 将数值a按位向右移动n位(如果n大于等于32，则为n对32取模结果的位数) ，不保留符号位(负数不保持最高位为1，因此右移后会变成正数)。  

示例：

```aardio
import console.int; 

//按位无符号右移
var b = -2>>>18;  

//显示 16383
console.print(b); 
```   

可以通过右移 0 位将有符号数强制转换为无符号数。

例如 `-1 >>> 0` 的值为 0xFFFFFFFF —— 其作用等价于 `raw.convert( {int value = -1},{INT value}).value`。 

[不声明调用原生 API](../../library-guide/builtin/raw/directCall.md) 默认会返回 32 位有符号整数，如果原 API 返回的是 32 位无符号整数，那么只要简单的将返回值 `>>> 0` 就可以得到原来的无符号数值了。