位操作符和位运算

作者&投稿:禽轮 (若有异议请与网页底部的电邮联系)
~ 位操作符是用来对数据进行二进制运算时用到的操作符号,并且是二进制按位对应操作。

一.&  与操作符

c = a&b,只有当a和b都是1的时候,c才等于1,只要a和b其中有一个为0,c都等于0,为什么是这么算的呢?计算机是通过二进制来进行数据操作的,这种与操作脱胎于与门电路,如下图

从与门逻辑电路来看,只有两条输入的线路都是接通的,输入都是1,出来的线路才是通的,输出才是1。这也是为什么只有当a和b都是1,结果才是1。如果c = 5 & 1; 先将5转成二进制数101,101与1进行与操作,将1前面补0,补成001,这样将两个二进制树按位与,结果为001,也就是c=0。

二.|  或操作符

c = a | b;只要a和b有一个为1,结果为1,a和b都是0,c结果为零

从或门逻辑电路来看,只要两条输入的线路有一条接通的,输入都是1,出来的线路都是通的,输出是1,只有两个输入都是0,输出才为0。这也是为什么只有当a和b都是0,结果才是0。如果c = 5 | 1; 先将5转成二进制数101,101与1进行或操作,将1前面补0,补成001,这样将两个二进制树按位与,结果为101,也就是c=5。

三. ^  异或操作(相同为0,相异为1)

c = a^b, 只有a和b不相同的时候,结果才为1,a和b相同时,结果为1;

从异或门逻辑电路来看,只要两条输入的线路状态不同,输入才是1,输出是1,如果两个输入都是1,输出也是0。如果c = 5 ^ 3; 先将5转成二进制数101,101与1进行或操作,将3前面补0,补成011,这样将两个二进制树按位与,结果为110,也就是c=6。

如面试常问的交换a= 5;b = 3;不借助中间变量:

a = a^b;  // 101^011 = 110  ;十进制是6;

b = a^b;  //此时a = 6,  110^011 = 101; 十进制是5;

a = a^b;  //此时=a = 6; b = 5;110^101 = 011; 十进制是3;

这样就完成两个数的交换。

四.移位操作 >>右移,<<左移

    1.正数左右移动,比如5<<1;5左移1位;二进制101左移一位末位补零1010 = 十进制10;可以看出左移相当于x2;101右移1位,10 = 十进制2;

    2.负数左右移动,负数移动会更加麻烦一点,比如int类型的-5

      负数移动是通过补码来操作的,我们先看下-5的补码,补码获取是按位符号位不变取反再加1:

      -5的二进制源码:10000000 00000000 00000000 00000101

      -5的二进制反码:11111111 11111111 11111111 11111010        (符号位不变,按位取反)

      -5的二进制补码:11111111 11111111 11111111 11111011          (反码+1)

    (1)左移1位:符号位不变左移后末尾补0:11111111 11111111 11111111 11110110

            然后将移动之后的补码转换回来,怎么转换回来呢?我们可以通过将移动后的数据转补码进行转换:符号位不变,按位取反再加1

        取反得到反码:10000000 00000000 00000000 00001001

        反码加1得到补码:10000000 00000000 00000000 00001010      (这个就是-5左移1位的结果-10;简单记忆就算负数左移是负数x2,如果超出int范围要实际运算

      (2)负数右移,符号位不变右移后前面补1:11111111 11111111 11111111 11111101

        取反得到反码:11111111 11111111 11111111 00000010

        反码加1得到补码:11111111 11111111 11111111 00000011      (这个就是-5右移后得到的结果-3;

五.& 、| 、^位操作符与=号联用,&=,|=,^=。

c &= a; //等价c = c & a;

c &= a & b;//等价c = c & (a & b)

c |= a; //等价c = c | a;

c |= a | b;//等价c = c | (a | b)

c ^= a; //等价c = c ^ a;

c ^= a ^ b;//等价c = c ^ (a ^ b)

六:为了加深理解,我们看下力扣的位操作算法题

颠倒二进制位

颠倒给定的 32 位无符号整数的二进制位。

提示:

请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。

在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。

示例 1:

输入:n = 00000010100101000001111010011100

输出:964176192 (00111001011110000010100101000000)

解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,

    因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。

示例 2:

输入:n = 11111111111111111111111111111101

输出:3221225471 (10111111111111111111111111111111)

解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,

    因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。

首先分析:要将32位的int数据颠倒过来,是不是就是将32个位置的二进制数从头部或者从尾部一个个取出然后添加。比如n = 5;

5的二进制:00000000 00000000 00000000 00000101

我们先声明一个int result = 0; 来接收数据;00000000 00000000 00000000 00000000

要将5里面取出的数存过来,是不是要先给数据留位置,所以result先要左移一位;

result <<=1;          得到 00000000 00000000 00000000 00000000;

从n = 5中取最后一位:int  num = n&1;  这样num=1; 取出了末位;

将末尾添加到result中 ,result = result | num;  这样就移动了一位到result 中;

result :00000000 00000000 00000000 00000001

要移动第二位;result 左移一位留出位置,result :00000000 00000000 00000000 00000010;

n右移一位 :00000000 00000000 00000000 00000010,然后取出末位,int num = n &1;

然后放到result里面,result = result | num;

可以看出操作是重复的借用循环:

public int reverseBits(int n) {

        int result = 0;

        for (int i = 0; i < 32; i++) {

            //res先往左移一位,把最后一个位置空出来,

            //用来存放n的最后一位数字

            result <<= 1;

            //result 加上n的最后一位数

            result |= n & 1;

            //n往右移一位,把最后一位数字去掉

            n >>= 1;

        }

        return result;

    }


位操作的位运算符
逻辑非并不是一个位操作。 按位或处理两个长度相同的二进制数,两个相应的二进位中只要有一个为1,该位的结果值为1。例如0101 (十进制 5) OR 0011 (十进制 3) = 0111 (十进制 7)在C类程序设计语言中,按位或操作符是|。这一操作符需要与逻辑按位或运算符(||)区别开来。按位或能够...

&和&&的区别
定义:1:&&在Java和PHP以及c#中都是逻辑操作符,也叫条件操作符。2:&&在bat中顺序执行多条命令,执行过程中如命令出错则停止执行之后的命令。3:c++中也会用&&来指定一个rvalue的引用类型。4:c语言中&&是一种双目运算符,表示与运算,而当左边所给表达式或变量为0时,不再计算右侧,整个表达式为...

关于C语言中 || 和 &&的用法
区别:1.运算符性质不同。&是一个位运算符。&&是一个逻辑运算符。2.作用不同。&是将两个二进制的数逐位相与,结果是相与之后的结果。&&就是判断两个表达式的真假性,只有两个表达式同时为真才为真,有一个为假则为假,具有短路性质。3.用途限制。&除了是一个位运算符,也是取地址符。&&就是...

关于位运算
当运算数只取0或1(或者表示为字面量false或true,有些语言如Java不允许隐式到整数0或1的转换)时,&&等价于位操作符&,||等价于位操作符|。在BASIC和其它一些语言中,∧对应AND,∨对应OR。与类C语言规定不同的是,∧和∨的优先级不是一定的。有些作者把∧和∨当作相同优先级的运算符;另外...

位运算符的问题,&不能进行int,float运算。为什么?
位运算符 只用于 整型。float 要转为 整型, 否则 编译 不能通过。int x=2,z;float y = 2.0;z = x & (int) y; \/\/ 这样才能通过编译。不会自动转换。否则有“illegal“ 操作数错误。printf("%x",z);

在C语言中,何为整型数的溢出?位操作符和移位操作符又是什么?
。。&& || !)那么结果应该是个Bool的值为true(非0即真,两个真就为真..)。如果是用1111B和1010B进行位与运算(&)那么结果应该是1010而不是1.这就是位运算..移位操作符 就是移位嘛..>>和<<.一个左移一个右移.你就当成一个是乘2一个是除2就好了,位移就*或\/几次2....

C语言的移位操作符使用方法
在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。━━━ 操作符 作用 ────────────────────────────& 位逻辑与 | 位逻辑或 ^ 位逻辑异或 - 位逻辑反 >> 右移 << 左移 ━...

&表示什么? &表示“和”还是“或”
&(Ampersand)是英语单字“and”之代表符号(在之前是英文字母表的第二十七个字母),亦可用作中文中的“和”、“与”之代表符号。这个符号源于拉丁文的et的连写。 可读做 ampersand,即 "and per se and",意思是 "and [the symbol which] by itself [is] and"。

c语言 “短路” 现象 使用位运算符&、|来取代&&、||
a==0 & b==0 & c==0;这其实是几个bool类型数据进行位与操作,相当于1 & 1 & 1(这是全部逻辑表达式为真的情况),结果也是为1,当作为if条件时候,其实也和上面的没有区别。使用逻辑运算符或位操作运算符来作为if的条件时候,并没有多大区别,主要是位操作符需要把每个逻辑式都运算,而逻辑...

Go语言中的符号"<<"是什么意思,什么操作符?
例:a = a << 2 将a的二进制位左移2位,右补0,左移1位后a = a * 2;若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。右移运算符(>>)将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。操作数每右移一位,相当于该数除以2。例如:a = a >...

汾西县18392421474: C语言什么是位运算 -
牧肿杞菊: C语言是为描述系统而设计的,它的第一个应用就是UNIX操作系统的设计,因此必须具有低级语言的特点.指针运算和位运算就是其代表. 我们知道,计算机中的信息以及控制信号均是以二进制码的0、1的形式存储和处理的.每一个0或1称为...

汾西县18392421474: "位操作运算符"不懂? -
牧肿杞菊: 简单提一下:设a,b均为逻辑量,取值为0或1位与:a&b只有当a和b都真时结果才为1位或:a|b只有当a,b都为0时结果才为0位非:~a结果为a的相反量位异或:你可以简单的理解成“相异而或”,即a,b不同时结果为1,a,b相同时结果为0其中“非”运算为单目运算符,其它都是双目运算符这些位运算符在数字电路中起到对电路的控制作用编程结合实际应用更好.

汾西县18392421474: C语言位操作运算符 &,|,~,^,<<,>>是干什么的? -
牧肿杞菊: 当然是操作位了 任何数据都是以二进制形式存储的 位操作运算符就是直接对二进制进行操作

汾西县18392421474: 什么是位运算 -
牧肿杞菊: 位运算通常是指对2进制数的运算,常见的位运算符有 & 按位与 | 按位或 ^ 按位异或 ~ 取反 > 右移 M>1是将M转化为2进制数,向右移动一位.

汾西县18392421474: c语言的按位运算符怎么操作!? -
牧肿杞菊: 位运算 在很多系统程序中常要求在位(bit)一级进行运算或处理.C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序. 一、位运算符C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右...

汾西县18392421474: 位操作符和逻辑运算符的区别 -
牧肿杞菊: 可以按照符号的不同来区分,C语言中逻辑运算符和按位运算符的符号是不一样的 C语言中提供了三种逻辑运算符:&&(与运算), ||(或运算), !(非运算) 与运算符(&&)和或运算符(||)均为双目运算符.具有左结合性.非运算符(!)为单目运算符

汾西县18392421474: java里,位运算&,│,^,是怎么用的 -
牧肿杞菊: 位操作符,一般我们是不会用到的.正常我们都只是用着java的api,把api组装成我们要的东西就可以了.如果你非要说为操作符可以做什么,嗯,那是“神的领域”,哇哈哈,举个例子吧,不要引入第三变量互换两个int变量的值:...

汾西县18392421474: 求详解位操作符 -
牧肿杞菊: int a = 1; //a的二进制表示为0x00000001 a a >> 1; //a右移1位,变为0x00000000,就是0 a | 1; //a按位或1,0x00000001 | 0x00000001,结果还是0x00000001 a & 1; //a按位与1,0x00000001 & 0x00000001,结果还是0x00000001 a ^ 1; //a按位异或1,0x00000001 ^ 00x00000001,结果为0x00000000 ~a; //a按位取反,结果为0x11111110 这些运算符的意思可参考教材,示例可参考上述

汾西县18392421474: java 中 +=,=+ 运算符 用法 -
牧肿杞菊: 位运算符 位运算是以二进制位为单位进行的运算,其操作数和运算结果都是整型值. 位运算符共有7个,分别是:位与(&)、位或(|)、位非(~)、位异或(^)、右移(>>)、左移(<<)、0填充的右移(>>>). 位运算的位与(&)、位...

汾西县18392421474: 在C语言中,何为整型数的溢出?位操作符和移位操作符又是什么? -
牧肿杞菊: 整型溢出:在整型数计算时,结果无法继续正确存储在整型变量中,即运算结果超出了整型数值所能表示的范围.比如计算100的阶乘等.溢出后的表现就是计算结果与期望值不符.位操作符,是C语言中的一组操作符,包括 按位与&,按位或|...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网