1.二进制与位运算

根据B站左神视频编写,第一次写博客,欢迎指出错误

一、二进制和位的概念

计算机中二进制使用补码表示(在计算机中,负数以其正值的补码形式表达

1.二进制正负转换:

正变负 :各个位数取反(0→1,1→0)再加一

负变正 :各个位数减一再取反(等同于取反再加一)

有符号的二进制表示较无符号的少了1/2(这里指非负数和负数要各占一半),这就能解释为何int型取值范围为:-2^31 ~ 2^31-1,而unsigned int(无符号整数型)取值范围为:2^32
为什么二进制负数比正数多一个
在二进制补码表示法中,0的表示有两种方式:+0和-0,因为+0和-0在计算机中存储的二进制表示是相同的,都是00000000。因此,一个8位二进制数中,-0和+0共用了一个表示范围,也就是00000000,而其他负数和正数则各自占用了一个范围,因此负数的数量比正数多一个。

1.1在计算机中正负转换(取反加一)

		int a = 78;
 		System.out.println(a);
		printBinary(a);
		printBinary(~a);
		int e = ~a + 1;
		System.out.println(e);
		printBinary(e);
78
00000000000000000000000001001110
11111111111111111111111110110001
-78
11111111111111111111111110110010
		

2.打印二进制

public static void printBinary(int num) {
for (int i = 31; i >= 0; i--) {
// 下面这句写法,可以改成 :
// System.out.print((num & (1 << i)) != 0 ? "1" : "0");
// 但不可以改成 :
// System.out.print((num & (1 << i)) == 1 ? "1" : "0");
// 因为a如果第i位有1,那么(a & (1 << i))是2的i次方,而不一定是1
// 比如,a = 0010011
// a的第0位是1,第1位是1,第4位是1
// (a & (1<<4)) == 16(不是1),说明a的第4位是1状态
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}

3.二进制、十六进制定义形式

二进制:int g = 0bxxxxxx;

十六进制:int d = 0X********;

4.常见的位运算(|、&、^、~、<<、>>、>>>)

在这里插入图片描述

可以这么写 : int num = 3231 | 6434;
可以这么写 : int num = 3231 & 6434;
不能这么写 : int num = 3231 || 6434;
不能这么写 : int num = 3231 && 6434;
因为 ||、&& 是 逻辑或、逻辑与,只能连接boolean类型
不仅如此,|、& 连接的两侧一定都会计算
而 ||、&& 有穿透性的特点

非负数 << 1,等同于乘以2
非负数 << 2,等同于乘以4
非负数 << 3,等同于乘以8
非负数 << i,等同于乘以2的i次方
------------------------------
非负数 >> 1,等同于除以2
非负数 >> 2,等同于除以4
非负数 >> 3,等同于除以8
非负数 >> i,等同于除以2的i次方
**只有非负数符合这个特征,负数不要用**

eg:

	int i = 0b0011010;
		printBinary(i);
		printBinary(i << 1);
		printBinary(i << 2);
		printBinary(i << 3);
00000000000000000000000000011010
00000000000000000000000000110100
00000000000000000000000001101000
00000000000000000000000011010000
	printBinary(i);
		printBinary(i >> 2);
		printBinary(i >>> 2);
		System.out.println("===i >> >>>===");
00000000000000000000000000011010
00000000000000000000000000000110
00000000000000000000000000000110
int j = 0b11110000000000000000000000000000;
		printBinary(j);
		printBinary(j >> 2);
		printBinary(j >>> 2);
		System.out.println("===j >> >>>===");
		非负数 >> >>>,效果一样
	printBinary(i);
		printBinary(i >> 2);
		printBinary(i >>> 2);
		System.out.println("===i >> >>>===");
00000000000000000000000000011010
00000000000000000000000000000110
00000000000000000000000000000110
// 负数 >> >>>,效果不一样
		int j = 0b11110000000000000000000000000000;
		printBinary(j);
		printBinary(j >> 2);
		printBinary(j >>> 2);
		System.out.println("===j >> >>>===");
11110000000000000000000000000000
11111100000000000000000000000000
00111100000000000000000000000000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值