算法与数据结构---位运算

本文详细介绍了Java中的位运算,包括与(&)、或(|)、异或(^)、左移(<<)、右移(>>)和取反(~)操作,并通过实例展示了它们在整数二进制表示和数值计算中的应用,如求二进制表示、加法运算、取反和转换等。同时,讨论了这些运算在实现数字逻辑和计算中的重要性。
摘要由CSDN通过智能技术生成

位运算: 
&  与运算 都是1 才等于1 其他都是0
 |   或运算  有1 为1  其他都是0 
^  异或运算  相通为0 不同为1
<< 向左移动
>> 向右移动
~  取反
一、打印int的32位  for(int i=31;i>=0;i--)  System.out.print((num&(1<<i))==0?"0":"1");
 使用位运算 &  << 
 int num=1;
num & 1<<31 向左移动31位 然后与1 与完  得到31位为0 
10000000000000000000000000000000
00000000000000000000000000000001
num & 1<<30 向左移动30位 然后与1 与完  得到30位为0 
01000000000000000000000000000000
00000000000000000000000000000001
以此类推
。。。。。。
num & 1<<2 向左移动2位 然后与1 与完  得到2位为0 
00000000000000000000000000000100
00000000000000000000000000000001
num & 1<<1 向左移动1位 然后与1 与完  得到1位为0 
00000000000000000000000000000010
00000000000000000000000000000001
num & 1<<0 向左移动0位 然后与1 与完  得到0位为1 
00000000000000000000000000000001
00000000000000000000000000000001

所以得到的二进制结果就是 00000000000000000000000000000001


0000 0000 0000 0000 0000 0000 0000 0001= 2的0次方=1
2(31次方) 2(20次方)....................2(4次方), 2(3次方),2(2次方),2(1次方),2(0次方)
 
0000 0000 0000 0000 0000 0000 0000 0010= 2的1次方=2
0000 0000 0000 0000 0000 0000 0000 0011= 2的1次方+2的0次方=3
0000 0000 0000 0000 0000 0000 0000 0100= 2的2次方=4
0000 0000 0000 0000 0000 0000 0000 0101= 2的2次方+2的0次方=5
0000 0000 0000 0000 0000 0000 0000 0110= 2的2次方+2的1次方=6
以此类推
........
最大
0111 1111 1111 1111 1111 1111 1111 1111= 2的31次方-1=Integer.max_value;
定格31为是作为符号  如果是0  表示非负  如果是1 表示 负数

~ 反码
int a=100  ;  int b=(~a+1)  1是二进制的加1  那b==-100

顶格是1 表示负数
1111 1111 1111 1111 1111 1111 1111 1111= 除了顶个的1 其他的取反
1000 0000 0000 0000  0000 0000 0000 0000  然后+1 =1000 0000 0000 0000  0000 0000 0000 0001=2的0次方=-1

1111 1111 1111 1111 1111 1111 1111 1110 = 除了顶个的1 其他的取反
1000 0000 0000 0000  0000 0000 0000 0001 然后加+1=1000 0000 0000 0000  0000 0000 0000 0010=2的1次方=-2

以此类推
....
最小(-2147483648)
1000 0000 0000 0000  0000 0000 0000 0000 =除了顶个的1 其他的取反
1111 1111 1111 1111 1111 1111 1111 1111 然后加+1=1000 0000 0000 0000  0000 0000 0000 0000=2的31次方 -2147483648 不管符号

或运算 |  有1就为1 其他都是0

举例  2个数字相加的底层算法
比如 1+9

1的32位是
0000 0000 0000 0000 0000 0000 0000 0001
9的32位是
0000 0000 0000 0000 0000 0000 0000 1001

得到的结果是 2个相加 都是1 前进一位1 当前变成0 
0000 0000 0000 0000 0000 0000 0000 1010=2的3次方+2的1次方=8+2=10


异或 ^  相同为0  不同为1

00000000000000011110001001000000
00000000000010011111101111110001

00000000000010000001100110110001

>>> 向右移  不带符号向右移
>> 带符号向右移  
printCode(Integer.MIN_VALUE);
printCode(Integer.MIN_VALUE>>>1);//不带符号向右移
printCode(Integer.MIN_VALUE>>1);//带符号向右移
10000000000000000000000000000000
01000000000000000000000000000000//不带符号向右移
11000000000000000000000000000000//带符号向右移


取反+1  加的是二进制
int c=5;
int d=-c;  
d=(~c+1);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值