精华内容
下载资源
问答
  • 二进制位运算的巧用

    2021-08-14 00:44:24
    二进制位运算的巧用 int n = 10; // 1 判断奇数偶数 if ((n & 1) == 1) { // 奇数 } else if ((n & 1) == 0) { // 偶数 } // 2 乘以2左移,除以2右移,无符号整数这么用,但要注意溢出,有符号...

    1. 判断奇数偶数

        int n = 10;
    
        // 1 判断奇数偶数
        if ((n & 1) == 1) {
            // 奇数
        }
        else if ((n & 1) == 0) {
            // 偶数
        }
    

    2. 乘以2左移,除以2右移

        // 2 乘以2左移,除以2右移,无符号整数这么用,但要注意溢出,有符号整数注意符号
        int n2 = n << 1;
        int n3 = n >> 1;
    

    3. 交换2个数,不使用其他的数

        // 3 交换2个数,不使用其他的数
        int a = 10;
        int b = 12;
        
        /// 方法1 
        a = a + b;
        b = a - b;
        a = a - b;
    
        /// 方法2
        a = a ^ b;
        b = a ^ b;  // 相当于 a ^ b ^ b = a ^ (b ^ b) = a ^ 0 = a;
        a = a ^ b;  // 相当于 a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b;
    

    4. a的b次方

        // 4 a的b次方 a = 10, b = 12
        /10进制    a^b = a ^ 12
        / 2进制    a^b =a^(1100) = a ^ (1000 + 100) 
        / 2进制    a^b = a ^ 1000 + a ^ 100
        /10进制    a^b = a ^ 8 + a ^ 4
        int sum = 0;
        while (b != 0) {
            if (b & 1 == 1) {
                sum *= a;
            }
            a *= a;
            b = b >> 1;
        }
    

    5. 不用加减乘除做加法,利用二进制位运算

    // 5 不用加减乘除做加法,利用二进制位运算
    // a + b
    int Add(int left, int right) 
    {
        int sum = 0;
        int carry = 0;
        do 
        {
            // 不考虑进位,对应位相加
            // 0+0、1+1均为0,0+1、1+0均为1,即为异或运算
            sum = left ^ right; 
            // 计算进位
            // 1+1才会进位,0+0、0+1、1+0均不进位,即为与运算,
            // 向前进位需要左移1位
            carry = (left & right) << 1; 
            left = sum;
            right = carry;
        } while (right != 0);
        return left;
    }
    
    展开全文
  • JS中遇到的二进制位运算问题 知识点: JS中的负值是通过补码来进行保存的,补码的计算流程就是: 确定绝对值的二进制表示(如,对于-18,先确定18 的二进制表示); 找到数值的一补数(或反码),换句话说,就是每个...

    JS中遇到的二进制位运算问题

    知识点:

    JS中的负值是通过补码来进行保存的,补码的计算流程就是:

    1. 确定绝对值的二进制表示(如,对于-18,先确定18 的二进制表示);
    2. 找到数值的一补数(或反码),换句话说,就是每个0 都变成1,每个1 都变成0;
    3. 给结果加1。

    而补码转换回十进制的方法就是:

    1. 补码减1
    2. 按位取反

    位运算

    遇到过这样一个语句,不是很理解原理:

    i = i | 0;
    

    后来在网上找到了资料解释很清晰:二进制位运算符

    即位运算符只对整数起作用,如果一个运算子不是整数,会自动转为整数后再执行。

    这个语句实现的效果就是将一个浮点数的小数部分忽略。位运算会自动忽略小数部分,与0进行或操作又会返回自身的值,因此达到了这么一个忽略小数的效果。

    function toInt32(x) {
      return x | 0;
    }
    
    toInt32(1.001) // 1
    toInt32(1.999) // 1
    toInt32(1) // 1
    toInt32(-1) // -1
    toInt32(Math.pow(2, 32))  // 0
    toInt32(Math.pow(2, 32) + 1) // 1
    toInt32(Math.pow(2, 32) - 1) // -1
    

    ECMAScript中的所有数值都以IEEE 754 64 位格式存储,但位操作并不直接应用到64 位表示,而是先把值转换为32 位整数,再进行位操作,之后再把结果转换为64 位。

    注意这里虽然是位运算最多操作32位整数,但由于默认ECMAScript 中的所有整数都表示为有符号数,所以第32位是符号位,所以实际位运算能正确处理的数值大小只有 [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31}-1] [231,2311]这个范围
    其实准确来说应该是 ( − 2 31 − 1 , 2 31 ) (-2^{31}-1, 2^{31}) (2311,231)的开区间,因为位运算会忽略小数。

    与位运算限制的32位整数不同,JavaScript所能表示的数值范围为正负1.7976931348623157乘以10的308次方,所以超过 [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31}-1] [231,2311]范围的数依然可以在JS中正常显示,只是无法正确运行位运算。

    为什么是这个范围呢?

    首先对于右侧边界

    b = Math.pow(2,31) -1 // 2147483647
    b.toString(2)
    // "1111111111111111111111111111111
    b.toString(2).length
    // 31
    

    上面可以看出 2 31 − 1 2^{31}-1 2311这个数在二进制表示中,除了符号位是0以外所有位数都是1。即所有非符号位都是1了,已经是位运算能接受的最大的数了。

    如果在这个边界基础上加1,即 2 31 2^{31} 231,则二进制表示为:

    b = b+1
    
    b.toString(2)
    // "10000000000000000000000000000000"
    b.toString(2).length
    // 32
    

    加1之后,二进制表示变成了如上所示,而这个数值如果进行位运算,第32位的1会被当作符号位进行处理,因此在位运算中会被当作一个负数进行处理。而这个32位二进制数 2 31 2^{31} 231在只有32位的情况下,二进制表示与 − 2 31 -2^{31} 231是相同的(下面有具体计算),所以右侧边界是 2 31 − 1 2^{31}-1 2311


    再其次对于左侧边界

    因此,在位操作中,对于 − 2 31 -2^{31} 231这个数来说的二进制补码表示为:

    1. 先计算 2 31 2^{31} 231的码字 10000000000000000000000000000000
    2. 按位取反 01111111111111111111111111111111
    3. 加1 10000000000000000000000000000000 结果竟然与 2 31 2^{31} 231码字相同

    这里的结果有点奇怪的原因是一般情况下的数据是64位存储的,所以按位取反那里应该理论上需要对64位进行取反,但是位运算符只看32位,所以在只看32位数的情况下 2 31 2^{31} 231超出了范围导致二进制表示与 − 2 31 -2^{31} 231相同。

    在位运算32位的表示下这个数会被当作负数进行处理,使用刚才的位运算取整函数返回的结果如下:

    b = Math.pow(2,31) 
    c = toInt32(b) //-2147483648
    

    结果是 − 2 31 -2^{31} 231,表示了 2 31 2^{31} 231在32位限制的位运算中被当作了 − 2 31 -2^{31} 231进行处理。

    d = toInt32(-b)
    // -2147483648
    

    − 2 31 -2^{31} 231由于二进制负数的特点可以在32位限制的位运算中正确运行。所以左侧边界是 − 2 31 -2^{31} 231。 如果左侧边界再延伸比如 − 2 31 − 1 -2^{31}-1 2311就会在转换为补码的计算中超出32位(补码计算 2 31 + 1 2^{31}+1 231+1时超出32位)。


    回到最初的这个例子:

    toInt32(Math.pow(2, 32))  // 0
    toInt32(Math.pow(2, 32) + 1) // 1
    toInt32(Math.pow(2, 32) - 1) // -1
    

    对于这个长度33的二进制数来说:

    e = Math.pow(2,32)  // 4294967296
    b.toString(2)
    // "100000000000000000000000000000000"
    e.toString(2).length // 33
    

    在位运算中会截取前32位进行运算,因为前32位都是0,所以在位运算中会被当作0进行处理,也就有了上面那些结果。

    展开全文
  • 7-5 C或Java中的二进制位运算 (40 分)

    千次阅读 2021-03-22 11:38:00
    本题目要求读入2个整数和一个字符,然后根据这个字符值,对两个整数进行相应的二进制位运算。要求必须使用switch选择结构。 (1)如果字符是&,则两个整数进行二进制位的与运算; (2)如果字符是 |,则两个整数...

    本题目要求读入2个整数和一个字符,然后根据这个字符值,对两个整数进行相应的二进制位的运算。要求必须使用switch选择结构。

    (1)如果字符是&,则两个整数进行二进制位的与运算;

    (2)如果字符是 |,则两个整数进行二进制位的或运算;

    (3)如果字符是^,则两个整数进行二进制位异或运算;

    (4)如果是其他字符,则固定输出信息:ERROR

    输入格式:
    在一行中依次输入整数1,字符,整数2。 字符的前后都有一个空格。

    输出格式:
    类似3 & 4 = 0

    其中,运算符号&的前后都有一个空格,等号的前后也都有一个空格。 上面表示3和4做二进制的与运算,结果是0。

    输入样例:
    符号&的前后,各有一个空格。

    3 & 4
    输出样例:
    3的二进制是0011,4的二进制是0100,二者与运算的结果是0。

    注意&和=的前后,都是有且仅有一个空格。

    3 & 4 = 0
    输入样例:
    7 X 3
    输出样例:
    ERROR

    
    
    import java.util.Scanner; 
    public class Main {
    
    	public static void main(String[] args) {
    		
    		Scanner sc = new Scanner(System.in);
    		int n=sc.nextInt();
    		String c=sc.next();
    		int m=sc.nextInt();
            
            switch(c.charAt(0)){
                case '&':
                    System.out.printf(n+" "+c+" "+m+" = "+(n&m));
                    break;
                case '|':
                    System.out.printf(n+" "+c+" "+m+" = "+(n|m));
                    break;
                case '^':
                    System.out.printf(n+" "+c+" "+m+" = "+(n^m));
                    break;
                default:
                    System.out.printf("ERROR");
            }
            /*
    		if(c.charAt(0)=='&') {
    			System.out.printf(n+" "+c+" "+m+" = "+(n&m));
    		}else if(c.charAt(0)=='|') {
    			System.out.printf(n+" "+c+" "+m+" = "+(n|m));
    		}else if(c.charAt(0)=='^') {
    			System.out.printf(n+" "+c+" "+m+" = "+(n^m));
    		}else {
    			System.out.printf("ERROR");
    		}
    		*/
    		
    
    		
    		
    	}
    
    }
    

    刚开始没看到用switch
    写的if else
    QWQ

    展开全文
  • 今天参照以下文章的内容,用Python实现了二进制位运算实现加法的打码。以下为代码,采用的递归调用:def getSum(a,b):ab_and=(a&b)<<1 #在这个地方出了一个逻辑bug,排查了半个小时才排查出来,我刚刚开始...

    今天参照以下文章的内容,用Python实现了二进制位运算实现加法的打码。

    以下为代码,采用的递归调用:

    def getSum(a,b):

    ab_and=(a&b)<<1    #在这个地方出了一个逻辑bug,排查了半个小时才排查出来,我刚刚开始的写法是 ab_and=a&b<<1,因为‘<

    ab_xor=a^b

    print('(a&b)<<1=',bin(ab_and)[2:].rjust(32,'0'))

    print('        a^b=',bin(ab_xor)[2:].rjust(32,'0'))

    print('-*'*30)

    if ab_and>0:

    return getSum(ab_and,ab_xor)

    else:

    return ab_xor

    a=int(input("请输入数字a:"))

    b=int(input("请输入数字b:"))

    print('    a={}的二进制形式为:'.format(a),bin(a)[2:].rjust(32,'0'))

    print('    b={}的二进制形式为:'.format(b),bin(b)[2:].rjust(32,'0'))

    sum=getSum(a,b)

    print('a+b={}的二进制形式为:'.format(sum),bin(sum)[2:].rjust(32,'0'))

    展开全文
  • ,|这种大量的运算,因此想要读明白这部分代码,对于计算机的二进制操作以及运算是必须要了解的,那么本篇我们就开始详细的学习二进制操作以及运算整数的二进制运算要理解整数的二进制,我们先来看看最熟悉的...
  • 了解python的二进制位运算,主要由以下几个方面展开: 一、bin()函数 将十进制转为二进制,输出的是字符串格式。 >>> bin(11) '0b1011' 其他八进制oct()、十六进制hex()。 二、format 以上的内置函数...
  • 1 得到 x 的二进制表示的最低,它等价于 x % 2: 例如当 x = 3 时,x 的二进制表示为 11,x & 1 的值为 1; 例如当 x = 6 时,x 的二进制表示为 110,x & 1 的值为 0。 对于十进制整数 x,我们可以用 ...
  • 二进制位运算遍历所有子集简介代码 简介 今日元宵节,力扣每日一题为Leetcode1178.猜字谜,鄙人愚钝,这条题目想了好久才明白,特此记录。 在用二进制记录哈希映射时,常用1表示选中,0表示未选中。 如 10101表示...
  • 二进制位运算符

    2021-10-08 11:21:45
    二进制位运算符用于直接对二进制位进行计算,一共有7个。 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。 二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果...
  • 进制转换与位运算

    2021-05-23 06:09:16
    二进制“001”为例, 每一都是一个bit。二进制只能由0/1组成,所以正好可以表示bit。什么是byte1个bit只能表示两种信号或者两种状态,表示的范围很小,例如英文字母26个就无法表示。所以规定8个bit一组作为一个...
  • 1 二进制 2 原码、反码、补码 3 运算符 4 运算符使用技巧 上回学习运算符时,漏了运算符,因为运算符理解起来稍微有点复杂,所以要单独写一篇~ 要理解按运算符,要先了解计算机进行存储和计算的底层逻辑。...
  • 第 34卷第 6期 衡 阳师范学院学报 No.6Vo1.342013年 12月 JournalofHengyangNormalUniversity Dec.2013C语言二进制位运算教学设计魏书堤 ,赵辉煌(衡 阳师范学院 计算机科学系,湖南 衡 ...
  • 目标: 【字符变量用来存储字符,一个字符占1个字节(8),字符存储的其实是 ASCII 码表中所对应的整数,这些整数以 0-1 ...位运算允许在二进制位级别上对数据进行操作。C 和 C++ 支持 6 种不同的运算符 按与 两
  • 二进制布尔运算

    2021-07-29 01:09:43
    二进制布尔运算是对二进制数进行布尔运算的一种运算二进制数的布尔运算有“与”、“或”、“非”和“异或”4种,二进制布尔运算在计算机编程中有广泛的应用,二进制布尔运算符为与(&),或(|),异或(^),当其...
  • Java中的二进制及基本的位运算二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹...
  • 一、二进制位运算1. 按与(&)位运算实质是将参与运算的数字转换为二进制,而后逐对应进行运算。按运算为:两全为1,结果为1,即1&1=1,1&0=0,0&1=0,0&0=0。例如51 & 5 -> ...
  • 一、计算机中的二进制位运算??二进制位运算并不是很难掌握,因为位运算总共只有5种运算:与、或、异或、左移、右移。与、或和异或运算的规律我们可以用表1总结如下。表1 与、或、异或的运算规律与(&)0 & 0...
  • ​ 利用二进制的一些特性,可以把位运算使用到更多问题上。例如,可以利用二进制位运算输出一个数组的所有子集。假设有一个长度为 n 的数组,可以生成长度为 n 的所有二进制,1 表示选取该数字,0 表示不选取。...
  • 一、二进制位运算1. 按与(&)位运算实质是将参与运算的数字转换为二进制,而后逐对应进行运算。按运算为:两全为1,结果为1,即1&1=1,1&0=0,0&1=0,0&0=0。例如51 & 5 -> ...
  • 比如:2 的 二进制为 00000000000000000000000000000010 左移一 00000000000000000000000000000100 >>> 不带符号右移:左边0补齐 比如:-2 的 二进制为 11111111111111111111111111111110 右移一 ...
  • 正数的原码,补码,反码都相同,都等于它本身负数的补码是:符号为1,其余各位求反,末位加1反码是:符号为1,其余各位求反,但末位不加1也就是说,反码末位加上1就是补码1. 定点小数的编码方法用定点小数引出数值的三种...
  • 二进制反码运算求和

    千次阅读 2021-10-06 17:12:31
    运算过程为: 第一步:1001+1000 = 10001 最高有进位(或者说“溢出”),将最高位移走,加到结果上。即: 第步:(1)0001+1 = 0010 第三步:0010 + 0001 = 0011 得出结果:0011 求反码,得到UDP校验和。 十六进制来...
  • 二进制运算规则

    2021-07-28 02:06:33
    二进制运算规则 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!14.90 积分课时数 NO:年月日 星期教案内容2.3 二进制数的运算规则2.4 数的定点与浮点表示教案目的...
  • 二进制运算方法

    2021-07-18 03:47:38
    二进制运算原理,大家都知道,不外乎,除2取余和乘2取整。这种费时、费力的方法,这里就不说了。考试讲究的时间,所以要找些简便的方法,必要时还是要记一下“二进制的变化形”,做到一看二进制数就知道其的十进制是...
  • 在python2.6以上的版本中自带了将十进制转化为二进制的函数bin()。看一下bin.__doc__怎么说的。>>>print bin.__doc__bin(number) -> stringreturn the binary represiontation of an integer or long ...
  • 二进制和十进制的转换and位运算

    千次阅读 2021-01-30 11:02:13
    二进制权:固定位置对应的单位值。比如一个数字从右往左从0开始递增 1.将二进制数转换成十进制 转换规则: 展开权进行求和运算 100110 1x2^5+0x2^4+0x2^3+1x2^2+1x2^1+0x2^0 1x32+0x16+0x8+1x4+1x2+0x1 32+0+0...
  • matlab二进制运算

    千次阅读 2021-04-23 10:56:52
    注意:输入应该为String类型的数 eg: bin2dec('01011100') ans = 92 >> bin2dec('1001') ans = 9 %%%%%%%%%%%%% bits= randn(1,bitnumbers)产生bitnumbers的伪随机二进制序列(PRBS) bits = randn(1,8) 1 ...
  • 它的意思是如果二进制位上的两个数是相同的那么数字是0,如果不同则1,那么我们可以利用异或运算这个特点来统计结果数的二进制上的1的个数即可。 AC代码 #include <bits/stdc++.h> using namespace std; ...
  • C语言进制位运算

    2021-05-21 05:49:28
    进制进制是一种表示数的方式... 每一对应的值就是系数基数:例如从二进制转换到十进制, 那么二就是基数例如从八进制转换到十进制, 那么八就是基数索引:从最低以0开始, 依次递增二进制转八进制把三个二进制位看做...
  • 二进制运算符

    2021-07-29 01:09:56
    概述作用速度块都作用于32整数二进制位运算符用于直接对二进制位进行计算,一共有7个。二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。二进制与运算符(and):符号为&,表示若两...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 386,424
精华内容 154,569
关键字:

二进制的位运算