计算机原理(一)
数字在计算机中的存储形式
参考:https://blog.csdn.net/alpinistwang/article/details/87994617
1个字节是8位 只有8种基本类型可以算.其他引用类型都是由java虚拟机决定的自己不能操作 byte 1字节 short 2字节 int 4字节 long 8字节 float 4字节 double 8字节 char 2字节 boolean 1字节
F的二进制码为 1111 7的二进制码为 0111 这样一来,整个整数 0x7FFFFFFF 的二进制表示就是除了首位是 0,其余都是1
int 二进制位数:32
short 二进制位数:16
long 二进制位数:64
float 二进制位数:32
double 二进制位数:64
int型数据在计算机中以二进制存储,一个int型数据占4个字节,一个字节占8位,一共32位。 (1)第一位是标志位,标志位为0表示正数,标志位为1表示负数。 (2)剩余的31位是用来表示数字部分的
由原理可知,计算机存储数字时,第一位是标志位,只有31位用来存储数字的值。所以最大表示的正数为0111 1111 1111 1111 1111 1111 1111 1111,即:2^31−1
int转二进制数
public static void main(String[] args) {
int a = 7;
String binaryString = Integer.toBinaryString(a);
System.out.println(binaryString);
}
输出:
111
计算机存储
原码 int型数据在计算机中以二进制存储,一个int型数据占4个字节,一个字节占8位,一共32位。 (1)第一位是标志位,标志位为0表示正数,标志位为1表示负数。 (2)剩余的31位是用来表示数字部分的
补码 在计算机中,数字以补码存储。正数的补码是其本身,负数的补码是除标志位外,其他位按位取反再加一。
补码的特性
1、一个负整数(或原码)与其补数(或补码)相加,和为模。 2、对一个整数的补码再求补码,等于该整数自身。 3、补码的正零与负零表示方法相同。
时钟的计量范围是0~23,所以时间的模等于24。假设当前时针指向17点,而准确时间是9点,调整时间可有以下两种方法: 1.倒拨8小时,即:17 - 8 = 9; 2.顺拨16小时:17 + 16 = 33 ; 33 % 24 = 9 此例中, 16 就是 -8 在 24 进制中的补码表示。用 16 表示 -8 的好处是将减法转为了加法。 如果正数和负数都用原码表示,计算机计算加减法需要做不同的处理。而如果使用补码表示,计算机计算加减法时统一使用加法计算即可,减轻了计算机的负担。
第一个例子:7的存储形式 原码 (1)7是正数,所以标志位为0 (2)剩余的31位表示数字部分:000 0000 0000 0000 0000 0000 0000 0111 所以7的原码是: 0000 0000 0000 0000 0000 0000 0000 0111
补码 正数的补码与原码一样,所以7在计算机中的存储形式为: 0000 0000 0000 0000 0000 0000 0000 0111
第二个例子:-7的存储形式 原码 (1)-7是负数,所以标志位为1 (2)剩余的31位表示数字部分:000 0000 0000 0000 0000 0000 0000 0111 所以-7的原码是: 1000 0000 0000 0000 0000 0000 0000 0111
补码 负数的补码是除标志位外,其他位按位取反再加一。所以-7在计算机中的存储形式为: 1111 1111 1111 1111 1111 1111 1111 1001
计算 9 + 5 9 的补码表示为: 0000 0000 0000 0000 0000 0000 0000 1001 5 的补码表示为: 0000 0000 0000 0000 0000 0000 0000 0101 两个补码相加,并去掉32位以外的数: 0000 0000 0000 0000 0000 0000 0000 1110 即得到了结果 14
计算 9 - 5 9 的补码表示为: 0000 0000 0000 0000 0000 0000 0000 1001 -5 的补码表示为: 1111 1111 1111 1111 1111 1111 1111 1011 两个补码相加,并去掉32位以外的数: 0000 0000 0000 0000 0000 0000 0000 0100 即得到了结果 4
逻辑运算符
~ (非运算符)
1.特点:一元操作符, 2.规则:生成与输入位相反的值--若输入0,则输出1;若输入1,则输入0 3.案例: int a = ~ 2 ; System.out.println(a); //结果为 4.分析: 2的二进制补码表示为: 00000000 00000000 00000000 00000010 运算: ~ 00000000 00000000 00000000 00000010 ------------------------------------------ 11111111 11111111 11111111 11111101 //该补码对应十进制为:-3
应用
1:~n=-(n+1),比如:~3=-4
2:获取整数n的二进制串中最后一个1:-n&n=~(n-1)&n
3:去掉整数n的二进制串中最后一个1:n&(n-1)。
& (与运算符)
1.特点:二元操作符,操作两个二进制数据;两个二进制数最低位对齐,只有当两个对位数都是1时才为1,否则为0 2.案例: int a = 3 & 2 ; System.out.println(a); //结果为 2 3.分析: 3的二进制补码表示为: 00000000 00000000 00000000 00000011 2的二进制补码表示为: 00000000 00000000 00000000 00000010 运算:3 & 2 00000000 00000000 00000000 00000011 & 00000000 00000000 00000000 00000010 ------------------------------------------- 00000000 00000000 00000000 00000010 二进制是2
应用
判断一个数n的奇偶性
n&1 == 1?”奇数”:”偶数”
为什么与1能判断奇偶?所谓的二进制就是满2进1,那么好了,偶数的最低位肯定是0(恰好满2,对不对?),同理,奇数的最低位肯定是1.int类型的1,前31位都是0,无论是1&0还是0&0结果都是0,那么有区别的就是1的最低位上的1了,若n的二进制最低位是1(奇数)与上1,结果为1,反则结果为0.
int a = 8;
if (a % 2 == 0) {
System.out.println("a是偶数");
} else {
System.out.println("a是奇数");
}
if ((a & 0x1) == 0) {
System.out.println("a是偶数");
} else {
System.out.println("a是奇数");
}
求一个整数的二进制中1的个数
思路:将整数n与1进行与运算,当整数n最低位是1时,则结果非零,否则结果为0。 然后将1左移一位,继续与n进行与运算,当次低位是1时,结果非零,否则结果为0。 循环以上操作,记录非零的次数即可。 代码如下:
public class TestDemo {
public static void main(String[] args) {
int a = 7;
int retNum = times1(a);
System.out.println(retNum);
}
public static int times1(int n ){
int count = 0;
int flag = 1;
while(flag > 31) == 1) ? ((~val) + 1) & (~(~0 >31))-(a>>31)
先整理一下使用位运算取绝对值的思路:若a为正数,则不变,需要用异或0保持的特点;若a为负数,则其补码为源码翻转每一位后+1,先求其源码,补码-1后再翻转每一位,此时需要使用异或1具有翻转的特点。
任何正数右移31后只剩符号位0,最终结果为0,任何负数右移31后也只剩符号位1,溢出的31位截断,空出的31位补符号位1,最终结果为-1.右移31操作可以取得任何整数的符号位。
那么综合上面的步骤,可得到公式。a>>31取得a的符号,若a为正数,a>>31等于0,a^0=a,不变;若a为负数,a>>31等于-1 ,a^-1翻转每一位.
位运算加法
由a^b可得按位相加后没有进位的和;
由a&b可得可以产生进位的地方;
由(a&b)
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?