算法学习笔记——二进制

二进制

负数的十进制转二进制数(-2 -> 1110):

  • 正数 - 1,再取反,得到负数的二进制。

  • 例如:-2 :0010 -> 0010 - 1 -> 0001 -> 取反 -> 1110

负数的二进制转十进制(1001 -> -7):

  • 负数取反,再 + 1,得到正数x,则结果为 -x
  • 例如:1001 -> 取反 -> 0110 -> 0110 + 1 -> 0111 ,则 - x = - 7

无符号范围:

  • 0 --- 2^(n-1),n为符号位数

有符号范围:

  • 正数范围:0 --- 2^(n-1) - 1,n为符号位数
  • 负数范围:-2^(n-1) --- -1,n为符号位数

~ 相反数:

  • 原数取反之后再加1,就是它的相反数
  • 负数的最小值不能转换出它的相反数,因为转换后还是原来的值,正数范围没有对应的数

位运算:

  • |:两个位都为0时,结果才为0,只要符号位有1就保留
  • &:两个位都为1时,结果才为1
  • ^:两个位相同为0,相异为1
  • 穿透性: 两个位都会执行,会一直穿透下去
  • << (左移):左移一位,整体状态向左移动一位,最低位(右边) 补一个0,左移多少位就补多少个0,非负数 << i 等同于乘以2的i次方,只有非负数符合这个特征,负数不要用
  • >> (右移):右移一位,整体状态向右移动一位,最高位(左边) 补一个1,右移多少位就补多少个1,非负数>> i 等同于除以2的i次方,只有非负数符合这个特征,负数不要用
  • >>> (右移):右移一位,整体状态向右移动一位,最高位(左边) 补一个0,右移多少位就补多少个0

逻辑运算:

  • ||:两个位都为false时,结果才为false,穿透性:当有一个为true就停止穿透,后面的不会继续执行
  • &&:两个位都为true时,结果才为true,穿透性:当有一个为false就停止穿透,后面的不会继续执行

为什么这么设计二进制:

  • 为了加法的逻辑是一套逻辑,没有条件转移,提高运算速度
  • 用位运算实现加减乘除,计算机中只有位运算逻辑单元,减乘除都是由加法高效地拼出来的

关于溢出:

  • 自己确保自己的调用所得到的结果不会溢出,一定是自己确保的,计算机不会给你做检查

打印二进制:

  • System.out.print((num & (1 << i)) == 0 ? "0" : "1");

  • 状态与1位移多少位进行与运算,结果为0则该位状态为0,大于0则为1

  • long类型的数字num,有64位

    num & (1 << 48),这种写法不对

    因为1是一个int类型,只有32位,所以(1 << 48)早就溢出了,所以无意义

    应该写出:num &(1L << 48)

相关推荐
math_hongfan几秒前
鸿蒙Flutter setState机制深入理解
学习·flutter·华为·harmonyos·鸿蒙
其实防守也摸鱼9 分钟前
补天SRC新手入门指南:从0到1的漏洞挖掘之路
网络·python·学习·安全·web安全·数据挖掘·挖洞
叩码以求索26 分钟前
统计按位或能得到最大值的子集数目(一)
数据结构·算法
tachibana21 小时前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
txzrxz1 小时前
单调队列讲解
数据结构·c++·算法·单调队列
不会就选b2 小时前
算法日常・每日刷题--<快排>4
算法
Keven_112 小时前
算法札记:树状数组的用途
数据结构·算法
用户677437175812 小时前
C++函数参数传递方式详解:string、string&、const string、const string&该怎么选?
算法
cpp_25012 小时前
P1540 [NOIP 2010 提高组] 机器翻译
数据结构·c++·算法·队列·noip·洛谷题解
晚笙coding2 小时前
LeetCode 98:验证二叉搜索树 —— 从局部判断到全局范围约束的递归思想
算法·leetcode·职场和发展