位运算反(~)与(&)异或(^)或(|)右移(>>)左移(<<)

先知道这两个二进制数据的特点:   1=0000 0000 0000 0000 0000 0000 0000 0001

-1=1000 0000 0000 0000 0000 0000 0000 0001

1.最高位(首位)表示正负(0为正,1为负)

2.最低位(末位)表示奇偶(0为偶,1为奇)

一、按位取反(~)

十进制1按位取反后=?

分析:

1. 十进制1转为二进制为:1= 0000 0000 0000 0000 0000 0000 0000 0001

2. 按位取反:把原来的二进制得到一个新的二进制,原来是0的则变为1,1的则变为0。

1按位取反后得到   1111 1111 1111 1111 1111 1111 1111  1110

3.二进制的最高位(首位)表示正负(1为负,0为正),如果是负数,如果是负数,则需要用计算机中的补码来表示。

补码:补码=符号位(最高位)以后按位取反再加1.

补码为   1000 0000 0000 0000 0000 0000 0000  0010

4. 结果为:把补码转为十进制:  -2;

~1==-2

十进制-1按位取反后=?

1.            -1的二进制是 1000 0000 0000 0000 0000 0000 0000 0001

2. 负数是以其补码的形式储存的

-1在计算机中存的是 1111 1111 1111 1111 1111 1111 1111 1111

3.    按位取反:             0000 0000 0000 0000 0000 0000 0000 0000

4.结果为:转为十进制:0

~-1==0

二、按位与and(&)

按位与and(&): 相同位的两个数字都为1,则为1;若有一个不为1,则为0。

25&3=>    25= 0000 0000 0000 0000 0000 0000 0001 1001

3= 0000 0000 0000 0000 0000 0000 0000 0011

-------------------------------------------------------------------------------------

0000 0000 0000 0000 0000 0000 0000 0001

25&3==1

三、按位异或(^)

按位异或(^):相同位不同则为1,相同则为0

25^3=>    25= 0000 0000 0000 0000 0000 0000 0001 1001

3=  0000 0000 0000 0000 0000 0000 0000 0011

-------------------------------------------------------------------------------------

0000 0000 0000 0000 0000 0000 0001 1010

25&3==26

四、按位或(|)

按位或(|):相同位只要一个为1即为1。

25|3=>    25=  0000 0000 0000 0000 0000 0000 0001 1001

3=  0000 0000 0000 0000 0000 0000 0000 0011

-------------------------------------------------------------------------------------

0000 0000 0000 0000 0000 0000 0001 1011

25|3==27

五、右移(>>)

     把1的位置向右移n位,超出的就舍掉

15=0000 0000 0000 0000 0000 0000 0000 1111

15>>1=0000 0000 0000 0000 0000 0000 0000 0111

15>>1=7

:右移1位即除以21;,并且取整。

n>>4==n/(24)

64>>4==4

六、左移(<<)

把1的位置向左移n位,超出的就舍掉

:左移1位即乘以21;,并且取整。

n<<4==n*24

2<<4==32

时间: 2024-10-07 00:23:24

位运算反(~)与(&)异或(^)或(|)右移(>>)左移(<<)的相关文章

php位运算 与 或 异或 取反

<?php /** php中有4个位运算,分别是&与 |或 ^异或 ~取反 & 两位全为1,结果为1 | 有一位为1,结果为1 ^ 一个为0,一个为1,结果为1 ~ 取反0->1,1->0 1.二进制的最高位是符号位,0表示正数,1表示负数. 2.正数的原码,反码,补码都一样. 3.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0). 4.负数的补码=它的反码+1. 5.0的反码,补码都是0. 6.php没有无符号数,换言之,php中的数都是有符

二进制和位运算中的异或

1.给出一个问题:给你一个整形数组,这个数组中除了一个数字仅仅出现一次外,其它数字都仅仅出现两次,求出那个仅仅出现一次的数字? 要求:时间复杂度为O(n) , 空间复杂度为O(1). 这个题目的难点在于空间复杂度的限制. 解法:一个数出现两个,两个数同样.而相等两个数异或的值为0 . 所以.我们仅仅须要把整个数组的数都异或一遍,我们就能得到仅仅出现了一次的那个数字 <span style="font-size:18px;">int get_one_num(int num[]

位运算中的异或运算

参与运算的两个值,如果两个相应的bit位相同,则结果为0,否则为1 char a1 = '十', a2 = '点', a3 = '进', a4 = '攻';            char secret = '8';            a1 = (char)(a1 ^ secret);            a2 = (char)(a2 ^ secret);            a3 = (char)(a3 ^ secret);            a4 = (char)(a4 ^ se

关于c语言中的位运算。。。

位运算是一种针对二进制数的一种运算 位运算 共有六种 都有其对应得操作符号 &      (and)      位于 |        (or)         位或 ~      (not)        取反 ^       (xor)        异或 >>    (shr)    右移一位 <<    (shl)     左移一位 运算说明: === 1. and运算 === and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位.这可

#C语言初学记录(位运算)

位运算 Problem Description7-1 数组元素循环右移问题 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0 ??A?1?A?N?1)变换为(A?N?M?? ?A?N?1?? A?0?? A?1?? ?A?N?M?1?? )(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式: 每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0):

Java的位运算

左移位操作 左移位运算的符号为[<<],左移位运算符左面的操作元称作被移位数,右面的操作数称作移位量. 左移位运算是双目运算符,操作元必须是整型类型的数据,其移动过程是:[a << n]运算的过程是通过将a的所有位都左移n位,每左移一个位,左边的最高位上的0或1被移出丢弃,并用0填充右边的低位 注意: 如果a是byte.short或int型数据,总是先计算出n%32的结果m,然后进行a<<m运算 对于long型数据,总是先计算出n%64的结果m,然后进行a <&l

FZU1892接水管游戏-BFS加上简单的状态压缩和位运算处理

原题地址:http://acm.fzu.edu.cn/problem.php?pid=1892 Problem 1892 接水管游戏 Accept: 108    Submit: 498 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description 接水管游戏的规则如下: 1.在N*N大小的方格上有两个特别的水管,分别为进水口和出水口: 2.有7种1*1大小的水管需要放在这N*N大小的方格内,使得水流能够从进水口经过这些

原码、反码、补码和位运算

参考: https://www.zhihu.com/question/20159860 https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 总结一些要点 为了使计算机运算数据更加简单,减法转换为加法: 1 - 1 => 1 + (-1).为了支持这个功能,计算机对数据的存储需要一些额外的处理. 原码:最高位作为符号位,也就是对于1和-1的区别,只是最高位不一样. 反码:正数的反码和原码是一致的,而负数,除

枚举中的位运算

为什么枚举中位运算都可以使用并运算? 1.  什么是枚举中的位运算? 例如 int a = 1 << 0; //1左移0位    1*2^0 = 1; int b = 1 << 1; //1左移1位   1*2^1 = 2; int c = 1 << 2; //1左移2位   1*2^2 = 4; int d = 1 << 3; //1左移3位   1*2^3 = 8; 并运算 a | b 01 10 -------------- 11 ==1+2 int