位运算运算律,位运算骚操作
位操作和基位操作符1。处理整数值时,可以直接对组成整数值的位进行操作。这意味着整数中的每个位都可以使用屏蔽技术获得。
2.(与)、(或)、(异或)、~(非/非)。
3.AND运算符将二进制位向右或向左移动。
4.运算符将用0填充高位;高位用运算符符号位填充,没有运算符。
5.对于int类型,1 ^ 35和1 ^ 3是一样的,而左边的操作数是long类型,需要操作右边的数字模型64。
6.和均为1,结果为1;或者:一个是1,结果是1;XOR:当两者不同时,结果为1。
提示1。判断奇偶数:x 1=1,则x为奇数,x 1=0,则x为偶数。
2.获取二进制位是1还是0: x一个奇数,然后将其向右移动相应的位数。
3.交换两个整数变量的值。
4.不用判断语句求整数的绝对值。
异或:可以理解为无进位加法:1 1=0,0 0=0,1 0=1。
1.交换律可以交换运算因子的位置,结果不变。
2.结合律(即(a b) c==a (b c))
3.对于任意数x,有x个x=0,x ^ 0=x,不同于自己或0,不同于0或为自己。
4.自反性a b b=a 0=a,同因子连续异或运算,最后的结果是你自己。
问题1:找出唯一的成对数字1-1000。这1000个数字放在一个有1001个元素的数组中,只有唯一的元素值是重复的,其他的只出现一次。每个数组元素只能被访问一次。设计一个算法找出来。没有辅助存储空间可以设计算法吗?
连续异或的思想消除了重复。
代码#包含iostream
使用命名空间std
int main()
{
int x=0,test[10]={1,2,3,4,5,6,7,8,9,7 };
for(int I=1;I=9;x=x^i;
for(int j=0;j 10j)x=x^test[j];
cout x endl
返回0;
}问题二:求单号。除了数组中的某个数字,其他数字都出现两次。请写一个程序找出这个只出现一次的数字。
连续异或的思想消除了重复。
代码#包含iostream
使用命名空间std
int main()
{
int x=0,test[11]={1,1,3,3,5,5,7,7,9,9,11 };
for(int j=0;j 11j)x=x^test[j];
cout x endl
返回0;
}问题3:二进制中1的个数。请实现一个函数,输入一个整数,输出这个数的二进制表示的1的个数。
例:9的二进制表示是1001,两位数是1。
1.整数x和1,然后将1向左移动32次;
2.整数X和1,然后循环右移32次;
3.x (x-1)可以消去最右边的1,直到x=0。
代码#包含iostream
使用命名空间std
int main()
{
int x,n=1,ans=0;
cin十世;
for(int I=0;i 32我)
if(x(n I))ans;
cout ans endl
返回0;
} #包含iostream
使用命名空间std
int main()
{
int x,ans=0;
cin十世;
for(int I=0;i 32我)
if((x I)1)ans;
cout ans endl
返回0;
} #包含iostream
使用命名空间std
int main()
{
int x,ans=0;
cin十世;
while (x)
{
x=x(x-1);
ans
}
cout ans endl
返回0;
}问题4:是2的整数次方吗?用一个语句判断一个整数是否是2的整数次方。
2的整数次幂意味着X中只有一个1,x (x-1)可以消去最右边的1。
代码#包含iostream
使用命名空间std
int main()
{
int x;
cin十世;
if((x(x-1))==0)cout yes endl;
else cout no endl
返回0;
}问题5:将一个整数的奇偶校验位交换成一个整数,交换其二进制形式的奇偶校验位的个数。
Idea一个数(0101)8得到它所有的奇数,(1010)8得到它所有的偶数。然后分别左右移动后,再异或一次,奇、偶数位互换。
代码#包含iostream
使用命名空间std
int main()
{
int x;
cin十世;
int ji=0x55555555,ou=0xaaaaaaaa
int a=x ji,b=x ou,c=(a 1)^(b 1);
cout c endl
返回0;
}问题6:0到1之间的浮点实数的二进制表示。给定一个0到1之间的实数(例如0.625),类型为double,打印其二进制表示(0.101,因为小数点后的二进制表示0.5,0.25,0.123…)。
如果数字不能在32位内准确地用二进制表示,则打印“错误”
浮点数转换成二进制数的思路是乘2,四舍五入。
代码#包含iostream
#包括cstring
使用命名空间std
int main()
{
字符串s;
int len=0;
双x;
cin十世;
while(x ^ 0)
{
double num=x * 2;
如果(数字=1.0)
{
s= 1
x=num-1;
}
其他
{
s=“0”;
x=num
}
len
如果(镜头32)
{
cout ERROR endl
返回0;
}
}
cout 0 s endl
返回0;
}问题7:K次1次的组中只有一个数出现一次,其他数都出现K次。请输出只出现一次的数字。
思路:K个相同的K进制数相加,不进位,结果是0。
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。