二进制算法题

1、怎么判断一个存储在计算机中的二进制是正数还是负数

参考:https://jingyan.baidu.com/article/fedf0737b29e7535ad89775d.html

要清楚是以有符号进行存储还是无符号进行存储。

(1)、 如果是无符号存储,则其为一个正数。

(2)、若是有符号存储,则为补码存储。

(补码存储)需要看其最高位,最高位为0,为正数; 反之,为负数。

(3)、 如果仅仅是给了一堆二进制:比如10101010,那么它是没有正负概念的。

或者说10101010是原码或者补码,进而推断它的原始的值。

2、原码、反码、补码

参考:负数的二进制表示_storm_fury-CSDN博客_负数的二进制表示

计算机中存储数据都是以补码存储的

正数的原码、反码、补码一样

负数的补码为对该数的原码取反,然后在最后一位加1

(1)、原码:

一个正数的原码,是按照绝对值大小转换成的二进制数;
一个负数的原码,是按照绝对值大小转换成的二进制数,然后最高位补1。

比如 :
00000000 00000000 00000000 00000101是 5的 原码。
10000000 00000000 00000000 00000101是 -5的 原码。

(2)、反码:
正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。

比如:
正数00000000 00000000 00000000 00000101的反码还是00000000 00000000 00000000 00000101
负数10000000 00000000 00000000 00000101每一位取反(除符号位),得11111111 11111111 11111111 11111010。

(3)、补码:
正数的补码与原码相同;
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
比如:
10000000 00000000 00000000 00000101的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

3、二进制的操作

与、或、异或、左移、右移

在不溢出的情况下

左移n位后的值 等于原值乘以2的n次方

例如 4 <<2 就是16,二进制就是 00000100 <<00010000

-4<<2 就是-16  二进制就是 11111100(负数在计算机中是以补码存在的) <<11110000,其中11110000是补码,想要知道它是多少需要先减一再取反(除符号位),减一是11101111,取反是10010000,所以是-16。

右移n位后的值 等于原值除以2的n次方的商

例如 4 >>2 就是1,二进制就是 00000100 >>00000001

-4>>2 就是-1  二进制就是 11111100 <<11111111,减一是11111110,取反是10000001,所以是-1。

4、编程题:

(1)、剑指offer面试题10:一个整数的二进制中1的个数:将整数的二进制表达的数每一位和1进行&运算,然后为例避免负数右移都是1的死循环情况,将1这个数字左移循环进行&运算。

(2)、剑指offer面试题40:数组中只出现一次的数字:

(3)、10进制转3进制:

上一篇:类与对象的关系


下一篇:面向对象及构造器