-
二进制数的逻辑运算
2011-11-03 19:46:56“与”运算是实现“必须都有, 否则就没有”这种逻辑关系的一种运算。 运算符为“? ”, 其运算规则如下: 0?0=0, 0?1=1?0=0, 1?1=1 b.“或”运算 “或”运算是实现“只要其中之一有, 就有”这种...
a.“与”运算
“与”运算是实现“必须都有, 否则就没有”这种逻辑关系的一种运算。 运算符为“? ”, 其运算规则如下:
0?0=0, 0?1=1?0=0, 1?1=1
b.“或”运算
“或”运算是实现“只要其中之一有, 就有”这种逻辑关系的一种运算, 其运算符为“+”。 “或”运算规则如下:
0+0=0, 0+1=1+0=1, 1+1=1
c.“非”运算
“非”运算是实现“求反”这种逻辑的一种运算,如变量A的“非”运算记作 。 其运算规则如下:
0的非=1,1的非=0d.“异或”运算
“异或”运算是实现“必须不同, 否则就没有”这种逻辑的一种运算, 运算符为“”。其运算规则是:
0异或0=0,0异或1=1,1异或0=1,1异或1=0一个数是2的幂次方,那么这个数的二进制位数中,只能有一位数值为1.
例如:10000, 100, 1等等。
从中可以看到,如果把这个数减去1,那么结果值的2进制位应该如下:1111,11,0等等。
这两个数的特点是:他们做或的时候,得到的结果是他们的和,例如:
10000和1111的或结果是11111, 100和11的或值是111,1和0的或是1。
所以我们可以如果实现一个方法判断一个数是否是2的幂次方:
Java代码
public static boolean is2Power(int number){
if(number<=0){
return false;
}
return (number|(number-1))==(2*number-1);
}
做一个测试:
Java代码
for(int i = 0;i<1000;i++){
if(is2Power(i)){
System.out.println(i);
}
}
得到的结果是:
Java代码
1
2
4
8
16
32
64
128
256
512
补充(另一种实现方法):
也可以通过对1的移位来实现。还是上面说的,如果一个数是2的幂,那么它的二进制表示中就只有一位1,所以如果对数1进行移位操作,总会在移到某个位的时候和这个数相等。所以这个实现如下:
Java代码
public static boolean is2Power(int number){
int j = 1;
while (number>j) {
j<<=1;
}
return j==number?true:false;
}
验证:
Java代码
for(int i = 0;i<10000;i++){
if(is2Power(i)){
System.out.println(i);
}
}
结果:
Java代码
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192 -
二进制数的逻辑运算方法
2014-11-27 12:48:53本课程的最大特点是采用全面的图表方式进行介绍,把原本复杂的转换方法以直观、简洁的方式向大家展示不同数制间的转换思路和方法,最终实现快速、轻松全面掌握数制方面的技术理论。 -
二进制算术、逻辑运算
2021-01-23 11:43:27二进制算术1、逻辑运算1.1 加法运算规则1.2 减法运算规则1.3 乘法运算规则1.4 除法运算规则2、逻辑运算 ...二进制数的运算包括算术运算、逻辑运算。 1、逻辑运算 1.1 加法运算规则 规则:逢二进一 例子: 1.2 减
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.二进制数的运算包括算术运算、逻辑运算。1、算术运算
1.1 加法运算规则
规则:逢二进一
例子:
1.2 减法运算规则
规则:借一当二
例子:
1.3 乘法运算规则
规则:乘什么就是什么
例子:
1.4 除法运算规则
规则:二进制的除法运算和十进制的类似,不存在进位、借位。
例子:
1.5 负数
二进制下负数的表示: 正数的反码加1
5: 00000000 00000000 00000000 00000101
5的反码: 11111111 11111111 11111111 11111010
-5: 11111111 11111111 11111111 111110112、逻辑运算
-
如何把二进制数化成十进制数_二进制数按位进行逻辑运算
2020-12-05 17:34:32首先要理解整数在机器内是如何用补码表示的:原码、补码、反码按位运算,就是对一个数(常量或变量)的二进制位与另一个数的对应二进制位进行运算。位运算有:& 位逻辑与,1&1等于1,1&0等于0,0&1...首先要理解整数在机器内是如何用补码表示的:原码、补码、反码
按位运算,就是对一个数(常量或变量)的二进制位与另一个数的对应二进制位进行运算。
位运算有:
& 位逻辑与,1&1等于1,1&0等于0,0&1等于0,0&0等于0
| 位逻辑或 ,1|1等于1,1|0等于1,0|1等于1,0|0等于0
^ 位逻辑异或 ,两个二进制位不同,结果为1,否则为0
~ 求反, 使一个数(常量或变量)的每一位变反,即0变1,1变0
>> 右移, 对一个数(常量或变量)的每一位右移
<< 左移, 对一个数(常量或变量)的每一位左移
例2.7.1 按位运算
#include <iostream> using namespace std; int main() { short int a,b,c; a=11; //a的二进制表示 00000000 00001011 b=39; //b的二进制表示 00000000 00100111 c=-23; //c的二进制表示 11111111 11101001 cout<<(a&b)<<endl; // a&b的结果 00000000 00000011 cout<<(a|b)<<endl; // a|b的结果 00000000 00101111 cout<<(a^b)<<endl; // a^b的结果 00000000 00101100 cout<<(~a)<<endl; // ~a的结果 11111111 11110100 cout<<(c>>2)<<endl; // c>>2的结果 11111111 11111010 cout<<(a<<2)<<endl; //左移一位相当于乘2运算,这里左移了2位 return 0; }
程序运行的输出结果 计算机内,整数是用补码表示的,能理解补码,就能解读程序的输出结果。
用移位运算实现整型变量a乘2(a<<2)或除2(a>>1)运算,效率比a*2或a/2运算高。
看看高手是如何活用位运算的
god-jiang:神级运算——位运算zhuanlan.zhihu.com -
java 8位 二进制数_《Java编程的逻辑》笔记8--整数的二进制表示与位运算
2021-02-27 16:36:46整数的二进制表示与位运算.png十进制要理解整数的二进制,我们先来看下熟悉的十进制。十进制是如此的熟悉,我们可能已忽略了它的含义。比如123,我们不假思索就知道它的值是多少。但其实123表示的1(10^2) + 2(10^1) ...整数的二进制表示与位运算.png
十进制
要理解整数的二进制,我们先来看下熟悉的十进制。十进制是如此的熟悉,我们可能已忽略了它的含义。比如123,我们不假思索就知道它的值是多少。
但其实123表示的1(10^2) + 2(10^1) + 3*(100),(102表示10的二次方),它表示的是各个位置数字含义之和,每个位置的数字含义与位置有关,从右向左,第一位乘以10的0次方,即1,第二位乘以10的1次方,即10,第三位乘以10的2次方,即100,依次类推。
换句话说,每个位置都有一个位权,从右到左,第一位为1,然后依次乘以10,即第二位为10,第三位为100,依次类推。
正整数的二进制表示
正整数的二进制表示与此类似, 只是在十进制中,每个位置可以有10个数字,从0到9,但在二进制中,每个位置只能是0或1。位权的概念是类似的,从右到左,第一位为1,然后依次乘以2,即第二位为2,第三位为4,依次类推。
看一些数字的例子吧:
image.png
负整数的二进制表示
十进制的负数表示就是在前面加一个负数符号-,例如-123。但二进制如何表示负数呢?
其实概念是类似的,二进制使用最高位表示符号位,用1表示负数,用0表示正数。
但哪个是最高位呢?整数有四种类型,byte/short/int/long,分别占1/2/4/8个字节,即分别占8/16/32/64位,每种类型的符号位都是其最右边的一位。
为方便举例,下面假定类型是byte,即从右到左的第8位表示符号位。
但负数表示不是简单的将最高位变为1,比如说:
byte a = -1,如果只是将最高位变为1,二进制应该是10000001,但实际上,它应该是11111111。
byte a=-127,如果只是将最高位变为1,二进制应该是11111111,但实际上,它却应该是10000001。
和我们的直觉正好相反,这是什么表示法?这种表示法称为补码表示法,而符合我们直觉的表示称为原码表示法,补码表示就是在原码表示的基础上取反然后加1。取反就是将0变为1,1变为0。
负数的二进制表示就是对应的正数的补码表示,比如说:
-1:1的原码表示是00000001,取反是11111110,然后再加1,就是11111111。
-2:2的原码表示是00000010,取反是11111101,然后再加1,就是11111110
-127:127的原码表示是01111111,取反是10000000,然后再加1,就是10000001。
给定一个负数二进制表示,要想知道它的十进制值,可以采用相同的补码运算。比如:10010010,首先取反,变为01101101,然后加1,结果为01101110,它的十进制值为110,所以原值就是-110。
byte类型,正数最大表示是01111111,即127,负数最大表示是10000000,即-128,表示范围就是 -128到127。其他类型的整数也类似,负数能多表示一个数。
负整数为什么采用补码呢?
负整数为什么要采用这种奇怪的表示形式呢?原因是:只有这种形式,计算机才能实现正确的加减法。
计算机其实只能做加法,1-1其实是1+(-1)。如果用原码表示,计算结果是不对的。比如说:
image.png
用符合直觉的原码表示,1-1的结果是-2。
如果是补码表示:
image.png
结果是正确的。
再比如,5-3:
image.png
结果也是正确的。
就是这样的,看上去可能比较奇怪和难以理解,但这种表示其实是非常严谨和正确的,是不是很奇妙?
理解了二进制加减法,我们就能理解为什么正数的运算结果可能出现负数了。当计算结果超出表示范围的时候,最高位往往是1,然后就会被看做负数。比如说,127+1:
image.png
计算结果超出了byte的表示范围,会被看做-128。
十六进制
二进制写起来太长,为了简化写法,可以将四个二进制位简化为一个0到15的数,10到15用字符A到F表示,这种表示方法称为16进制,如下所示:
image.png
可以用16进制直接写常量数字,在数字前面加0x即可。比如10进制的123,用16进制表示是0x7B,即123 = 7*16+11。给整数赋值或者进行运算的时候,都可以直接使用16进制,比如:
int a = 0x7B;
Java中不支持直接写二进制常量,比如,想写二进制形式的11001,Java中不能直接写,可以在前面补0,补足8位,为00011001,然后用16进制表示,即 0x19。
查看整数的二进制和十六进制表示
在Java中,可以方便的使用Integer和Long的方法查看整数的二进制和十六进制表示,例如:
int a = 25;
System.out.println(Integer.toBinaryString(a)); //二进制
System.out.println(Integer.toHexString(a)); //十六进制
System.out.println(Long.toBinaryString(a)); //二进制
System.out.println(Long.toHexString(a)); //十六进制
位运算
位运算是将数据看做二进制,进行位级别的操作,Java不能单独表示一个位,但是可以用byte表示8位,可以用16进制写二进制常量。比如: 0010表示成16进制是 0x2, 110110表示成16进制是 0x36。
位运算有移位运算和逻辑运算。
移位有:
左移:操作符为<
无符号右移:操作符为>>>,向右移动,右边的舍弃掉,左边补0。
有符号右移:操作符为>>,向右移动,右边的舍弃掉,左边补什么取决于原来最高位是什么,原来是1就补1,原来是0就补0,将二进制看做整数,右移1位相当于除以2。
例如:
int a = 4; // 100
a = a >> 2; // 001,等于1
a = a << 3 // 1000,变为8
逻辑运算有:
按位与 &:两位都为1才为1
按位或 |:只要有一位为1,就为1
按位取反 ~: 1变为0,0变为1
按位异或 ^ :相异为真,相同为假
大部分都比较简单,就不详细说了。具体形式,例如:
int a = ...;
a = a & 0x1 // 返回0或1,就是a最右边一位的值。
a = a | 0x1 //不管a原来最右边一位是什么,都将设为1
写在最后
都看到这里,保存思维导图,顺便给个赞呗
-
二进制数的运算
2020-06-01 23:08:44有关二进制的算术运算、逻辑运算 -
二进制数的运算方法
2016-01-10 02:15:44二进制数的运算方法 电子计算机具有强大的运算能力,它可以进行两种运算:算术运算和逻辑运算。1.二进制数的算术运算 二进制数的算术运算包括:加、减、乘、除四则运算,下面分别予以介绍。(1)二进制数的... -
二进制的逻辑运算
2013-06-23 20:50:09假设我们的系统中,每一个基本功能对应一个权值,该值是一个无符号二进制数,为2的n次方(n为正整数),系统所有功能对应的权值不重复。 功能 权值 基本功能1 1 基本功能2 10 基本功能3 100... -
二进制数的运算规则
2018-08-24 10:14:32(3) 乘法运算规则 例如:二进制数之间可以执行算术运算和逻辑运算,其规则简单,容易实现。 (1) 加法运算规则 0 + 0 = 0 例如: 1 1 0 1 0 + 1 = 1 +) 1 0 0 1 1 + 0 = 1 1 + 1 = 0 (产生进位) ... -
二进制数的运算方法---【转载】
2016-10-25 17:36:36二进制数的运算方法 电子计算机具有强大的运算能力,它可以进行两种运算:算术运算和逻辑运算。 1.二进制数的算术运算 二进制数的算术运算包括:加、减、乘、除四则运算,下面... -
数的表示方法:十进制、二进制、八进制、十六进制等,以及二进制数的运算...
2019-09-13 22:37:46关于一个数的表示,我们常用的是十进制(人一般有十根手指嘛),另外也可以通过二进制、八进制、十六进制等表示数(可以相互转换),而计算机存储数...这里整理下数的表示方法,以及二进制数的运算。 参考文章: h... -
c移位运算为啥要截取_二进制数按位进行逻辑运算
2021-01-12 09:37:54首先要理解整数在机器内是如何用补码表示的:原码、补码、反码按位运算,就是对一个数(常量或变量)的二进制位与另一个数的对应二进制位进行运算。位运算有:& 位逻辑与,1&1等于1,1&0等于0,0&1... -
二进制与逻辑运算
2016-08-02 20:14:15二进制是十分深刻的思想,不是说,一个数字系统只有 0/1 就意味着它是二进制,而是某系统,仅有两种状态: 0/1 开关 阴阳 黑白 男女 -
逻辑运算中两个十进制数进行运算,化为二进制后如果两个数位数不同是在高位补零还是直接把数字搬下来...
2015-06-17 09:21:00逻辑运算中两个十进制数进行运算,化为二进制后如果两个数位数不同是在高位补零还是直接把数字搬... 答案: 逻辑运算中两个十进制数进行运算,化为二进制后如果两个数位数不同,则对位数少的那个数在高位补零. ... -
两个二进制数异或的结果
2015-05-05 10:56:54【面试题目 -亢龙有悔整理】两个二进制数异或结果是多少? a^b = |a-b| (按位相减取绝对值...二进制数的逻辑运算包括逻辑加法(“或”运算)、逻辑乘法(“与”运算)、逻辑否定(“非”运算)和逻辑“异或”运算。 (1 -
C/C++/JAVA 二进制/十六进制 的应用 :大数(超过32位二进制数),按位逻辑运算,属性值设置,等
2017-05-06 03:11:30按位逻辑运算,属性设置按位逻辑运算在高效率的数据操作中应用很多,平时用的高级语言里面,多数时候不需要我们去手动设置这些,因为已经被封装在各种模块/类里面了。在需要手动定义一些功能的时候,这些运算方法很... -
Java 进制转换(二进制(负),八进制,十进制,十六进制),位运算、逻辑运算(2)...
2019-10-07 16:20:06负数的二进制表现形式:其实就是该数的绝对值取反+1. 进制转换(二进制,八进制,十进制,十六进制),原理解析 十六进制的表现形式: (2)(与、异或、左移、右移、三元运算符) 转载于:... -
二进制逻辑运算详解
2009-08-17 19:04:43二进制数1和0在逻辑上可以代表“真”与“假”、“是”与“否”、“有”与“无”。这种具有逻辑属性的变量就称为逻辑变量。 计算机的逻辑运算的算术运算的主要区别是:逻辑运算是按位进行的,位与位之间不像加减运算... -
通过二进制逻辑运算解题
2020-06-29 19:36:51思路:2的幂次的二进制只含有一个1,n-1则除了该位为0,其余皆为1,故而n & (n-1) = 0 import java.util.*; public class Main { public static void main(String[] args){ Scanner in = new Scanner(System... -
数据的二进制表示和位运算(算数&逻辑)
2018-04-02 20:50:00在写嵌入式的程序中,常会将数据定义为unsigned int,这样定义有什么好处呢?下面从逻辑右移和算术右移的角度进行分析。...C语言的标准指出,无符号数执行的所有移位操作都是逻辑的,而对于有符号数,采用哪种方式取... -
【转载】计算机程序的思维逻辑 (4) - 整数的二进制表示与位运算
2017-06-06 09:48:00上节我们提到正整数相乘的结果居然出现了负数,要理解这个行为,我们需要看下整数在计算机内部的二进制表示。 十进制 要理解整数的二进制,我们先来看下熟悉的十进制。十进制是如此的熟悉,我们可能已忽略了它的... -
基于逻辑操作和符号数字表达的光学并行负二进制运算
2021-02-11 03:56:07研究了光学负二进制并行...基于符号数字负二进制表达,提出了任意字长操作数的并行两步加法与一步减法。这些基本运算都可通过空间编码与解码的光学逻辑实现,从而提供了一种有效的光学算术-逻辑单元(ALU)设计方案。 -
计算机程序的思维逻辑 (4) - 整数的二进制表示与位运算【转】
2017-01-05 11:01:00上节我们提到正整数相乘的结果居然出现了负数,要理解这个行为,我们需要看下整数在计算机内部的二进制表示。 十进制 要理解整数的二进制,我们先来看下熟悉的十进制。十进制是如此的熟悉,我们可能已忽略了它的... -
整数的二进制、位运算、逻辑与或
2019-10-03 11:14:06正整数的二进制表示与此类似, 只是在十进制中,每个位置可以有10个数字,从0到9,但在二进制中,每个位置只能是0或1。 例如: 0000 1010 ==> 10 负整数的二进制表示 (假定类型是byte) 十进制的负数... -
设计一个运算电路, 输入为一个两位的二进制数A1A0, 输出的二进制数比输入量的平方还大5, 用最少的与非门...
2019-12-17 10:53:34输入的2位二进制数的范围为0~3D, 则输出的范围为5D~14D, 那么输出最少需要4位二进制数来表示. 设输出的4位二进制数从高位到低位分别为Y3、Y2、Y1、Y0, 根据"输出的二进制数比输入量的平方还大5"这一逻辑关系, 得到...