位运算

位运算符和赋值运算符

浪尽此生 提交于 2020-03-03 18:17:47
位运算符 位运算只能对整数进行,可以是整数型变量也可以是被识别为整数类型的字面量。位运算是对该整数实际存储的二进制串的二进制位进行操作,可以进行6种位运算: 运算符 作用 & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 << 左移 >> 右移 位运算都不改变操作数本身的值,而是位运算表达式本身的值为进行位运算之后的值,例如: char a = 0 B00101101 ; char b = 0 B10100110 ; char c = a & b ; // c == 0B00100100 char d = a | b ; // d == 0B10101111 char e = a ^ b ; // e == 0B00100100 char f = ~ a ; // f == 0B11010010 char g = a << 2 ; // g == 0B10110100,低位补0 char h = a >> 2 ; // h == 0B00001011,高位补0 char gg = b << 2 ; // gg == 0B10011000,低位补0 char hh = b >> 2 ; // hh == 0B11101001,高位补1 左移运算,低位一定补0。右移运算,如果是signed类型则补符号位,unsigned类型则补0,例如: unsigned char b = 0

Java千问:Java位运算经典应用(四)

爷,独闯天下 提交于 2020-03-03 08:28:39
接上篇 七、判断某数是不是2 的N 次幂 我们知道,10的0次幂是1,1次幂是10,2次幂是100...仔细观察一下这些数,你就会发现一个规律,那就是:这些数字当中,开头是1,后面N位上的数字全部是0。这是我们用十进制表示数字所得到的一个规律。同理,如果用 二进制 表示数字的话,那么对于2的N次幂也有相同的规律。 用二进制表示 2的0次幂为1,2的1次幂为10,2的2次幂为100...规律很明显,也1开头,后面N位都是0。 我们利用这个规律,就可以判断一个数字是不是2的N次幂。具体实现办法也很简单,假设一个数字为a,我们用”a减去1的值”与”a自身”做一个按位与运算,如果运算结果为0,那么说明a就是2的N次幂。为什么呢?就是因为2的N次幂减1之后,开头的那个1会因为“退位”变成0,而后面的0都会变成1,这样,与原来的a做按位与的运算,恰好是1和0相对,运算结果自然为0。 我们可以用一个具体的数字来证明,比如说2的3次方,也就是数字8,如果用二进制来表示的话就是”1000”,而8-1=7,7用二进制来表示就是”0111”,这两个二进制串的每一个位恰好是0和1相对,如果它们做按位与的运算,其结果恰好为0。我们根据这个运算结果是否为0就能判断出某个数是不是2的N次幂。完整的判断代码如下: public static void main(String[] args) { int a1 =

程序中的位运算

99封情书 提交于 2020-03-02 22:29:36
位运算是我们常用的一种运算方式,在计算机底层逻辑中,存在着大量的位运算。因此,在你的计算机编程中,可以适当的使用一些位运算,不但会增加程序的运行效率,还会使你的程序看着更高级一些。下面依次说一下位运算的运算符,以及可以使用的操作。 按位与运算符& 与 & 运算符的运算规则如下: 0&0=0; 0&1=0; 1&0=0; 1&1=1;当且仅当两个数值都是1的条件下,结果才是1. 用处: 判断奇偶性 x & 1 == 0 则说明该x是奇数,反之,就是偶数。因为偶数的最后一位肯定是0,而奇数的最后一位为1,用1去和最后一位做与运算,如果是0,则说明是偶数,只有当是1的情况,才是奇数。 按位或运算 或 | 运算符的运算规则如下:0|0=0; 0|1=1; 1|0=1; 1|1=1;当且仅当二者都是为0的条件下,结果才为0.只要有一个数值是1,结果就是1. 具体的用处待补充 按位异或 ^ 运算 异或 ^ 运算符的运算规则如下:0 ^ 0 = 0; 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0; 当两个数值不同的时候,结果为1,否则为0. 用处: 0和任何数做异或运算,结果还是原数值 两个相同的数值进行异或运算,结果为0. 左移运算符 << 将一个数值的二进制为向高位移动若干位。如 4 << 1,将4的二进制向左移动一位,相当于原数值乘以2. 右移运算符 >>

Java千问:Java位运算经典应用(三)

守給你的承諾、 提交于 2020-03-02 10:47:33
接上篇 五、字符串加密 在很多场合下,都需要给字符串进行加密,使字符串由”明文”变成”密文”。对字符串加密有很多种算法,其实我们利用位运算也可以实现简单的加密效果。用位运算实现加密的原理很简单,这里为大家讲解一下。假设有两个整数a和b ,a^b的结果为c。我们可以认为a就是原始数据,a与b进行异或运算所得到的c就是加密后的数据,b在加密过程中扮演着”密钥”的角色。在不知道b值的情况下,如果只是知道c的值,任何人无法仅仅根据c的值反推出a的值,也就是说,如果我们只知道加密后的数据,而不知道密钥,根本无法确切得知原始数据a的值到底是多少。如果想根据加密后的数据c来还原初始数据a,就必须用密钥b来解密。解密的方法也很简单,只要进行c^b的操作就可以了。其原理就是”a^b^b=a”,在这个等式中,”a^b”的结果就是c,所以”c^b=a”。 理解了加密和解密的最基本原理之后,我们再来说说如何具体对字符串实施加密操作。我们知道,位运算符只能对byte、short、int、long和char这几种基础类型的数据进行运算,对字符串这种引用类型的数据并不适用。既然字符串无法进行位运算,那么该如何对字符串进行加密呢?我们知道,无论是图片还是文本,在计算机当中都是以二进制数的形式进行存储的。既然是二进制数,那么每8位的二进制数,都可以转换成一个byte类型的数据。而N个8位二进制

Java千问:Java位运算经典应用(四)

断了今生、忘了曾经 提交于 2020-03-02 10:46:33
接上篇 七、判断某数是不是2的N次幂 我们知道,10的0次幂是1,1次幂是10,2次幂是100...仔细观察一下这些数,你就会发现一个规律,那就是:这些数字当中,开头是1,后面N位上的数字全部是0。这是我们用十进制表示数字所得到的一个规律。同理,如果用二进制表示数字的话,那么对于2的N次幂也有相同的规律。用二进制表示2的0次幂为1,2的1次幂为10,2的2次幂为100...规律很明显,也1开头,后面N位都是0。 我们利用这个规律,就可以判断一个数字是不是2的N次幂。具体实现办法也很简单,假设一个数字为a,我们用”a减去1的值”与”a自身”做一个按位与运算,如果运算结果为0,那么说明a就是2的N次幂。为什么呢?就是因为2的N次幂减1之后,开头的那个1会因为“退位”变成0,而后面的0都会变成1,这样,与原来的a做按位与的运算,恰好是1和0相对,运算结果自然为0。 我们可以用一个具体的数字来证明,比如说2的3次方,也就是数字8,如果用二进制来表示的话就是”1000”,而8-1=7,7用二进制来表示就是”0111”,这两个二进制串的每一个位恰好是0和1相对,如果它们做按位与的运算,其结果恰好为0。我们根据这个运算结果是否为0就能判断出某个数是不是2的N次幂。完整的判断代码如下: public static void main(String[] args) { int a1 = 5; int

了解面试算法之

。_饼干妹妹 提交于 2020-03-01 12:26:36
算法,一门既不容易入门,也不容易精通的学问。 对于笔者来说算法算是我程序员生涯很不擅长的技能之一了,自从互联网界招人进入平静期后,越来越多的大厂在社招的时候不但会考验面试者的工作所用到的技能,而且会用算法题来考验面试者的逻辑思维能力和基本数据结构的掌握能力。这也就让想要社招进入大厂的部分同学有了一些望而却步的心理,毕竟工作中大部分时间在与UI层面的逻辑打交道,数据处理方面即使之前在学校中掌握的还还不错,几年的 CV 生活,估计也忘的差不多了。 但是作为一条有梦想的咸鱼,我们还是要重拾这些知识的。之前写过一篇 搞懂单链表常见面试题 ,有兴趣的同学可以跳转浏览。今天笔者将会挑选几道栈与队列和位运算的相关题目来回顾下相关算法的基本知识。 栈与队列 栈与队列分别是两种数据结构,不同语言对于栈和队列有着不同的声明,在 java 中 Stack 类是继承自 Vector 集合的子类,Queue 则是以接口形式存在,常用的其实现类是 LinkedList 这个双向队列。在C++的标准模版库也是有这两个数据结构定义的具体类的。 栈数据结构的特点是 FILO(first in last out) 即先进后出,队列则是 FIFO(first in first out)即先进先出。相信栈与队列的数据结构的基本特点大家也是熟记于胸了。下面就带大家看一道面试题来带大家看下这两者在面试题中的形式。

普通位运算

感情迁移 提交于 2020-02-29 03:01:23
#include <stdio.h> int main(void) { //定义一个无符号字符型变量,此变量只能用来存储无符号数 unsigned char result; int a,b,c,d; a = 2; b = 4; c = 6; d = 8; //对变量进行“按位与”操作 result = a & c; printf("result = %d\n",result ); //2 //对变量进行“按位或”操作 result = b | d; printf("result = %d\n",result ); //12 //对变量进行“按位异或”操作 result = a ^ d; printf("result = %d\n",result ); //10 //对变量进行“取反”操作 result = ~a; printf("result = %d\n",result ); //253 } /** 按位与(&)运算符:参加运算的两个运算符,如果都为1,则该位为1,否则为0 按位或(|)运算符:两个相应位中只要有一个为1,则该位的结果为1. 按位异或(^)运算符:参加运算的两个相应位,同号则结果为0(假),异号则结果为1(真) 取反(~)运算符:他是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变为1,1变为0。 注意点: --位运算符是对二进制按位进行运算

位运算

妖精的绣舞 提交于 2020-02-29 00:47:03
首先 要明白位运算是在二进制中的运算方式,所有其他进制的数在进行位运算时都要先转化成二进制数再进行运算。 位运算主要包括按位与(&)、按位或(|)、按位异或(^)、取反( ~ )、左移(<<)、右移(>>)这几种。 其中除了取反( ~ )以外,其他的都是二目运算符,即要求运算符左右两侧均有一个运算量。 补码 补码是为了表示一个负数的二进制形式。 其转化方式是,先将负数当成正数,转化成二进制的形式,再将二进制正数的各个位上取反,再加上一。 例如-5 先求出5的二进制数 : 0000 0000 0101 然后将各个位上0变1,1变0 : 1111 1111 1010 最后再加1 : 1111 1111 1011 按位与(&) 运算的两个数,转换算为二进制后,进行与(&)运算。 当相应位上的数都是1时,该位取1,否则该为0。 例如5 & -5 5 : 0000 0000 0101 -5 :1111 1111 1011 答案 : 0000 0000 0001 按位或(|) 运算的两个数,转换为二进制后,进行或(|)运算。 只要相应位上存在1,那么该位就取1,如果都不为1,就为0。 还是5 | -5 0000 0000 0101 1111 1111 1011 可以看到每一位中其中一个都有1 答案 :1111 1111 1111 按位异或(^) 运算的两个数,转换成二进制数后,进行异或(^

按位运算

落爺英雄遲暮 提交于 2020-02-28 23:38:41
按位运算 C有这些按位运算的运算符: &按位的与 |按位的或 ~按位取反 ^按位的异或 <<左移 右移 1.按位与& (x)i 1并且(y)i 1,那么(x&y)i=1 否则的话(x&y)=0 两个整数按位与,如果对应的位上,比如x的第i位和y的第i位都是1,的话,与的结果就是1,否则是0 如: 01011010 16进制的5A 10001100 16进制8C 与的结果 00001000 结果08 按位与常用于两种应用: ①让某一位或某些位为0: x & 0xFE,FE是11111110 如: 11111110 & 10100101 得: 10100100 前7位不变,最后一位变成了0 所以那1和别的数相与,意味着要看那个数等于多少 ②取一个数中的一段:x & 0xFF 具体给出多少个二进制的1,那些1对应的位会留下来,其它为都变0拿走 2.按位或| 如果(x)i 1或(y)i 1,那么(x|y)i=1,否则的话(x|y)i=0 如: 10101010 AA | 01010100 54 得: 11111110 FE 按位或常用于两种应用: ①使得一位或几位为1: 如:x|0x01 希望这个数最右边的最后一个比特是1,或1就变1 ②把两个数拼起来: 0xooFF|0xFF00 4.按位取反~ (-x)i=1-(x)i 把1位变0,0位变1 如: 10101010 AA

Java 位运算(转)

北城以北 提交于 2020-02-28 11:44:37
位移动运算符: <<表示左移, 左移一位表示原来的值乘2. 例如:3 <<2(3为int型) 1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011, 2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位, 3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100, 转换为十进制是12。 同理,>>表示右移. 右移一位表示除2. 位运算: 位运算符包括: 与(&)、非(~)、或(|)、异或(^)   &:当两边操作数的位同时为1时,结果为1,否则为0。如1100&1010=1000    | :当两边操作数的位有一边为1时,结果为1,否则为0。如1100|1010=1110    ~:0变1,1变0    ^:两边的位不同时,结果为1,否则为0.如1100^1010=0110 位运算与位移动运行符的一个场景: HashMap的功能是通过“键(key)”能够快速的找到“值”。下面我们分析下HashMap存数据的基本流程: 1、 当调用put(key,value)时,首先获取key的hashcode,int hash = key.hashCode(); 2、 再把hash通过一下运算得到一个int h. hash ^= (hash >>> 20) ^