您现在的位置是:亿华云 > 应用开发
Java位运算小节
亿华云2025-10-02 23:16:57【应用开发】4人已围观
简介2019新春支付宝红包技术大揭秘在线峰会将于03-07日开始,点击这里报名届时即可参与大牛互动。位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算。位运算符可以分为逻辑运算符(包括
2019新春支付宝红包技术大揭秘在线峰会将于03-07日开始,位运点击这里报名届时即可参与大牛互动。位运
位运算表达式由操作数和位运算符组成,位运实现对整数类型的位运二进制数进行位运算。位运算符可以分为逻辑运算符(包括~、位运&、位运|和^)及移位运算符(包括>>、位运<<和>>>)。位运
在进行位运算时,需要注意几点:
位运算符的优先级
~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|。位运算的应用
1.判断int型变量a是奇数还是偶数
2.求平均值,比如有两个int类型变量x、亿华云计算y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围。
(x&y)+((x^y)>>1);知识点:>>n 相当于除于2^n ,<<n 相当于乘于2^n 。x,y对应位均为1,相加后再除以2还是原来的数,如两个00001000相加后除以2仍得00001000,那么我们把x与y分别分成两个部分来看,两者相同的位分别拿出来则:x =(111111111111000)2=(111111111111000)2+(000000000000000)2y =(111111111111010)2=(111111111111000)2+(000000000000010)2相同部分我们叫做x1,y1,不同部分我们叫做x2,y2.那么现在(x+y)/2=(x1+y1)/2+(x2 + y2)/2,因为x1 == y1 ,所以(x1+y1)/2==x1 ==y1,相同部分我们用与运算求出来 x1 = x&y ,不同部分的和我们用^求出来,然后除于2就是我们想要的结果了。3.对于一个大于0的整数,判断它是不是2的几次方
((x&(x-1))==0)&&(x!=0);/*如果是2的幂,n一定是100... n-1就是1111.... 所以做与运算结果为0*/4.比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法
x ^= y; y ^= x; x ^= y;5.求绝对值
int abs(int x ){ int y ; y = x >>31;return(x^y)-y ;//or: (x+y)^y}6.取模运算,采用位运算实现
a %(2^n)等价于 a &(2^n -1);或者 m % n 等价于 m &(n-1)7.乘法运算 采用位运算实现
a *(2^n)等价于 a << n8.除法运算转化成位运算
a /(2^n)等价于 a>> n9.求相反数
(~x+1)10.a % 2 等价于
a &111.取int型变量a的第k位 (k=0,1,2……sizeof(int))
a>>k&1(先右移再与1)12.将int型变量a的第k位清0
a&~(1<<k)(10000取反后为00001)13.将int型变量a的第k位置1
a|(1<<k)14.int型变量循环左移k次
a<<k|a>>16-k (设sizeof(int)=16)15.int型变量a循环右移k次
a>>k|a<<16-k (设sizeof(int)=16)16.对于一个数 x >= 0,判断是不是2的幂。
boolean isPower2(int x){ return((x&(x-1))==0)&&(x!=0);}17.不用temp交换两个整数
void swap(int x ,int y){ x ^= y; y ^= x; x ^= y;}18.条件判断赋值简写
if(x == a) x= b;else x= a;等价于 x= a ^ b ^ x;19.x的相反数
(~x+1)20.m乘以2的n次方
m << n21.m除以以2的n次方
m >> n22.求整数k从x位(高)到y位(低)间共有多少个1
publicstaticint findChessNum(int x,int y,int k){ int result =0;for(int i = y; i <= x; i++){ result +=((k >>(i -1))&1);}return result;}23.取绝对值
int abs(int n){ return(n ^(n >>31))-(n >>31);}/* n>>31 取得n的符号,若n为正数,n>>31等于0,若n为负数,n>>31等于-1若n为正数 n^0=0,数不变,若n为负数有n^-1 需要计算n和-1的补码,然后进行异或运算, 结果n变号并且为n的绝对值减1,再减去-1就是绝对值 */24.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1: 输入:[2,2,1]输出:1示例 2:
输入:[4,1,2,1,2]输出:4这个题首先想到的就是异或的特性。相同的数字异或的结果为 0,那么出现奇数次的一定就是最后我们想要的结果。
publicint singleNum(int[] nums){ int res = num[0];for(int i=1;i<nums.length;i++){ res ^= nums[i];}return res;}总结
功能 示例 位运算 去掉最后一位 (101101->10110) x >> 1 在最后加一个0 (101101->1011010) x < < 1 在最后加一个1 (101101->1011011) x < < 1+1 把最后一位变成1 (101100->101101) x 1 把最后一位变成0 (101101->101100) x 1-1 最后一位取反 (101101->101100) x ^ 1 把右数第k位变成1 (101001->101101,k=3) x (1 < < (k-1)) 把右数第k位变成0 (101101->101001,k=3) x & ~ (1 < < (k-1)) 右数第k位取反 (101001->101101,k=3) x ^ (1 < < (k-1)) 取末三位 (1101101->101) x & 7 取末k位 (1101101->1101,k=5) x & ((1 < < k)-1) 取右数第k位 (1101101->1,k=4) x >> (k-1) & 1 把末k位变成1 (101001->101111,k=4) x (1 < < k-1) 末k位取反 (101001->100110,k=4) x ^ (1 < < k-1) 把右边连续的1变成0 (100101111->100100000) x & (x+1) 把右起第一个0变成1 (100101111->100111111) x (x+1) 把右边连续的0变成1 (11011000->11011111) x (x-1) 取右边连续的1 (100101111->1111) (x ^ (x+1)) >> 1 去掉右起第一个1的左边 (100101000->1000) x & (x ^ (x-1)) 判断奇数 (x&1)==1 判断偶数 (x&1)==0点击阅读更多,查看更多详情
很赞哦!(552)
上一篇: 如何提高数据中心的可持续性技能?
下一篇: 量子数据中心可能是未来的发展方向