<1> 移位运算符

Java 中的移位运算符主要有三种:左移位运算符(<<)、右移位运算符(>>)和无符号右移位运算符(>>>)。

左移位运算符(<<)将其左边的操作数向左移动其右边指定的位数,并用零填充空缺位置。左移位运算符可以将一个数的每一位向左移动,因此可以实现对一个整数的位分解。

例如,对于整数 7(二进制表示为 0111),左移一位后变为 14(二进制表示为 1110),左移两位后变为 28(二进制表示为 11100)。

右移位运算符(>>)将其左边的操作数向右移动其右边指定的位数,并用符号位(最高位)填充空缺位置。如果左操作数为正数,则右移位将其除以 2 的指定次幂;如果左操作数为负数,则右移位将其向下取整除以 2 的指定次幂。

例如,对于整数 -7(二进制表示为 11111111111111111111111111111001),右移一位后变为 -4(二进制表示为 11111111111111111111111111111100),右移两位后变为 -2(二进制表示为 11111111111111111111111111111110)。

无符号右移位运算符(>>>)将其左边的操作数向右移动其右边指定的位数,并用零填充空缺位置。对于无符号右移位运算符,不考虑符号位,将所有位都看作是正数进行处理,因此可以实现对一个整数的分解。

例如,对于整数 -7(二进制表示为 11111111111111111111111111111001),无符号右移一位后变为 2147483644(二进制表示为 01111111111111111111111111111100),无符号右移两位后变为 1073741822(二进制表示为 00111111111111111111111111111110)。

下面是几个移位运算符的例子:

```java

int x = 60; // 60 的二进制表示为 0011 1100

int y = -7; // -7 的二进制表示为 1111 1111 1111 1111 1111 1111 1111 1001

// 左移位运算符

int z1 = x << 2; // 将 x 左移两位,得到 240(1111 0000)

System.out.println(z1);

// 右移位运算符

int z2 = y >> 2; // 将 y 右移两位,得到 -2(1111 1111 1111 1111 1111 1111 1111 1110)

System.out.println(z2);

// 无符号右移位运算符

int z3 = y >>> 2; // 将 y 无符号右移两位,得到 1073741822(0011 1111 1111 1111 1111 1111 1111 1110)

System.out.println(z3);

```

在实际编程中,移位运算符可以用于位运算、二进制处理等方面。例如,可以使用左移位运算符将一个数乘以 2 的指定次幂,可以使用右移位运算符将一个数除以 2 的指定次幂。另外,可以使用移位运算符对二进制数据进行分解、合并、提取等操作。

参考代码:

```java

// 将一个整数分解为二进制字符串

public static String toBinaryString(int num){

StringBuilder sb = new StringBuilder();

for (int i = 31; i >= 0; i--){

int mask = 1 << i;

sb.append((num & mask) != 0 ? "1" : "0");

}

return sb.toString();

}

// 将两个整数按位合并为一个新的整数

public static int merge(int x, int y){

int z = 0;

for (int i = 0; i < 32; i++){

int mask = 1 << i;

z |= (x & mask) != 0 ? mask : 0;

z |= (y & mask) != 0 ? (mask << 1) : 0;

}

return z;

}

// 从一个整数中提取指定位置的二进制位

public static int extract(int num, int start, int end){

int mask = (1 << (end - start + 1)) - 1;

return (num >> start) & mask;

}

// 将一个二进制字符串转换为整数

public static int fromBinaryString(String binStr){

int num = 0;

for (int i = 0; i < binStr.length(); i++){

int bit = binStr.charAt(i) - '0';

num <<= 1;

num |= bit;

}

return num;

}

// 将一个整数进行二进制翻转

public static int reverse(int num){

int result = 0;

for (int i = 0; i < 32; i++){

result <<= 1;

result |= (num & 1);

num >>= 1;

}

return result;

}

```

壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(48) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部