一.位运算符
-
定义
- 对数值进行二进制的位运算
- 在位运算中 0 为假, 1为真
-
分类
- & : 有0则为0
- | : 有1则为1
- ^ : 相同为0 , 不同为1
- ~ : 按位取反
- >> : 有符号右移(次高位改变,即次高位增加一位,不改变符号位,这叫有符号)
- << : 有符号左移(次高位减少一位)
- >>> : 无符号右移(最高位改变,即不考虑符号位,这叫做无符号)
-
演示
public static void main(String[] args) { int a = 10; //二进制表现为 1010 int b = 5; //二进制表现为 0101 System.out.println(a&b); 1010 (10和5的二进制数进行与运算) 0101 &(与运算,真假为假,假假为假,真真为真,0为真,1为假) 0000 (结果都是假,二进制转换为十进制数为0) System.out.println(a|b); (和与运算同理,两个二进制数进行或运算) System.out.println(a^b); (同理,两个二进制树进行异或运算,即真真为真,假假为真,真假为假) System.out.println(~a); (同理,10的二进制数都取反,但是注意是左右都取反,而二进制数第一位表示符号,所以数的正负号也变了) 0000 0000 0000 0000 0000 0000 0000 1010 1111 1111 1111 1111 1111 1111 1111 0101(进行反运算之后) System.out.println(a>>1);//右移一位 相当于除以2 0000 1010 00000 101 (相当于10/2,注意5/2=2) System.out.println(a<<1);//左移一位,相当于乘以2 0000 1010 0000 10100 System.out.println(a>>>1);//无符号位移,缺失的首位补0 }
-
注意事项
- 一个数异或同一个数两次,结果还是本身
-
测试题
-
不借助第三个变量的前提下交换两个整数变量的值
a = a^b; b = a^b;//相当于b = a^b^b = a (把第一步的a带进来) a = a^b;//与上面同理,一个数异或同一个数两次,结果还是本身;
-
二.泛型
1.把泛型定义在类上
- 泛型类型必须是引用类型数据,但是定义时泛型名可以是任何符号,具体实现泛型时必须是引用类型.
public class 类名<泛型名>{}
package com.qianfeng.www.day17;
import java.security.spec.RSAOtherPrimeInfo;
public class TestFanxing {
public static void main(String[] args) {
perso1<String> stringperso1 = new perso1<>("1");
System.out.println(stringperso1.time);
}
}
//类上面加了一个泛型,T只是一个代号
class perso1<T> {
//这里的T可以当作一个数据类型来定义变量,和定义类时的泛型一致
T time;
String name;
//构造一个有参构造器,通过输入泛型类型的参数来定义上面的泛型型变量;
public perso1(T time) {
this.time = time;
}
}
//代表这个泛型里面只能加入Object类或者它的子类;
class person2<T extends Object>{}
2.把泛型定义在方法上
public <泛型类型> 返回类型 方法名(泛型类型 变量名){}
public <E> E(返回值类型可以是其他东西) mothod(E[] e){}
注意:导包的时候千万不能导错包,不然程序运行不了.
public class TestFanxing2 {
//泛型限制方法的类型,也可以定义<e extends String>,
public <e> e prin(e n) {
return n;
}
//这个就相当于上面泛型限制的e为String
public String prins(String string) {
return string;
}
public static void main(String[] args) {
TestFanxing2 testFanxing2 = new TestFanxing2();
System.out.println(testFanxing2.prin(1));
System.out.println(testFanxing2.prin("nihao"));
//我们只能往list里面添加;integer或者他的父类
List<? super Integer> list = new ArrayList<>();
}
}
3.通配符<?>
- 如果没有规定类型,就可以是Java中的任意类.
- <? extends 父类> (代表泛型只能填该父类和他的子类).
- <? super 子类> (代表泛型只能填他的该子类和他的父亲)(只能在集合等中用)