您当前的位置: 首页 > 

wespten

暂无认证

  • 1浏览

    0关注

    899博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

计算机原理(一)

wespten 发布时间:2019-06-17 10:11:11 ,浏览量:1

计算机原理(一)

数字在计算机中的存储形式

参考: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)

关注
打赏
1665965058
查看更多评论
0.0403s