Java中的位运算符 >>与>>>等

Java中的位运算符:<<、>> 与>>>

·转载请标明出处

java中有三种移位运算符
1 . << : 左移运算符,num << 1,相当于num乘以2
2 . >> : 右移运算符,num >> 1,相当于num除以2
3 . >>> : 无符号右移,忽略符号位,空位都以0补齐

1.<<

<< : 左移运算符,num << 1,相当于num乘以2
正数左移低位补0。

例:

1.4<<1
2. -4 << 1

1.
4的原码为

0000 0000 0000 0000 0000 0000 0000 0100

右移一位后为:

0000 0000 0000 0000 0000 0000 0000 1000

所以转成十进制为8

2.
-4的原码为

1000 0000 0000 0000 0000 0000 0000 0100

补码为

1111 1111 1111 1111 1111 1111 1111 1100

左移一位后为

1111 1111 1111 1111 1111 1111 1111 1000

再转成原码为

1000 0000 0000 0000 0000 0000 0000 0111

转成十进制为-8。

2.>>

<< : 右移运算符,num << 1,相当于num除以2。
正数右移高位补0,负数右移高位补1。

例:

1.4<<1
2. -4 << 1
带符号右移(相当于除以2)。

1.

4的原码为

0000 0000 0000 0000 0000 0000 0000 0100

右移一位后为

0000 0000 0000 0000 0000 0000 0000 0010

转成十进制为2。

2.

-4的原码为

1000 0000 0000 0000 0000 0000 0000 0100

补码为

1111 1111 1111 1111 1111 1111 1111 1100

右移一位后为

1111 1111 1111 1111 1111 1111 1111 1110

再转成原码为

1000 0000 0000 0000 0000 0000 0000 0010

转成十进制为**-2**。

3.>>>

'>>>'无符号右移。无论是正数还是负数,高位通通补0。

例:

4 >>> 1

4的原码为

0000 0000 0000 0000 0000 0000 0000 0100

右移一位后为

0000 0000 0000 0000 0000 0000 0000 0010

最后转成十进制为2。

-4 >>> 1

-4的原码为

1000 0000 0000 0000 0000 0000 0000 0100

补码为

1111 1111 1111 1111 1111 1111 1111 1100

右移一位后为

0111 1111 1111 1111 1111 1111 1111 1110

由于右移后符号位为1,即变成正数,所以原码与补码一样为

0111 1111 1111 1111 1111 1111 1111 1110

转成十进制为2147483646

总结: 正数进行位运算的时候>>>与>>结果与意义相同

无符号右移。无论是正数还是负数,高位通通补0.
无符号右移,忽略符号位,空位都以0补齐

带符号右移相当于原数据除以2的n次方
同理:带符号左移相当于原数据乘以2的n次方

下面用代码来看看这些移位运算都是怎样使用的

//位运算符使用
package com.b510.test;

/**
 * @author XuLoobee
 * @create date:2020-3-31
 */
public class Test {

    public static void main(String[] args) {
        int number = 10;
        //原始数二进制
        printInfo(number);
        number = number << 1;
        //左移一位
        printInfo(number);
        number = number >> 1;
        //右移一位
        printInfo(number);
    }
    
    /**
     * 输出一个int的二进制数
     * @param num
     */
    private static void printInfo(int num){
        System.out.println(Integer.toBinaryString(num));
    }
}

运行结果位

1010
10100
1010

我们把位数补齐一下来看看

43210位数
1010十进制:10原始数number
10100十进制:20左移一位number = number << 1
1010十进制:10右移一位number = number >> 1

看完想必大家基本会明白位运算了吧!!

XuLoobee

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用双指针法遍历链表,如果当前节点的值与下一个节点的值相同,则将指针指向下一个不同值的节点,否则将当前节点加入新链表。具体实现可以参考以下代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct ListNode { int val; struct ListNode *next; } ListNode; ListNode* deleteDuplicates(ListNode* head) { if (head == NULL || head->next == NULL) { return head; } ListNode *dummy = (ListNode *)malloc(sizeof(ListNode)); dummy->next = head; ListNode *prev = dummy; ListNode *curr = head; while (curr != NULL) { if (curr->next != NULL && curr->val == curr->next->val) { while (curr->next != NULL && curr->val == curr->next->val) { curr = curr->next; } prev->next = curr->next; } else { prev = curr; } curr = curr->next; } return dummy->next; } int main() { ListNode *head = (ListNode *)malloc(sizeof(ListNode)); head->val = 1; head->next = (ListNode *)malloc(sizeof(ListNode)); head->next->val = 2; head->next->next = (ListNode *)malloc(sizeof(ListNode)); head->next->next->val = 3; head->next->next->next = (ListNode *)malloc(sizeof(ListNode)); head->next->next->next->val = 3; head->next->next->next->next = (ListNode *)malloc(sizeof(ListNode)); head->next->next->next->next->val = 4; head->next->next->next->next->next = (ListNode *)malloc(sizeof(ListNode)); head->next->next->next->next->next->val = 4; head->next->next->next->next->next->next = (ListNode *)malloc(sizeof(ListNode)); head->next->next->next->next->next->next->val = 5; head->next->next->next->next->next->next->next = NULL; ListNode *newHead = deleteDuplicates(head); while (newHead != NULL) { printf("%d ", newHead->val); newHead = newHead->next; } printf("\n"); return 0; } ``` 输出结果为:1 2 5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值