早教吧作业答案频道 -->数学-->
不使用循环计算32位整数的奇偶校验位//bitParity-returns1ifxcontainsanoddnumberof0's“返回1假如x里有基数的0”*Examples:bitParity(5)=0,bitParity(7)=1*Legalops:&^|+>可以使用的符号x=(x>>16)^
题目详情
不使用循环计算32位整数的奇偶校验位
//bitParity - returns 1 if x contains an odd number of 0's “返回1假如x里有基数的0”
* Examples:bitParity(5) = 0,bitParity(7) = 1
* Legal ops:& ^ | + > 可以使用的符号
x = ( x >> 16 ) ^ x;
x = ( x >> 8 ) ^ x;
x = ( x >> 4 ) ^ x;
x = ( x >> 2 ) ^ x;
x = ( x >> 1) ^ x;
return (x & 1);
}
完全看不懂,我对bit的了解太模糊了,越基础越好,越详细越好,为什么要移位,这个方法的原理是什么?而且我带进去得出来的答案和问的相反.
//bitParity - returns 1 if x contains an odd number of 0's “返回1假如x里有基数的0”
* Examples:bitParity(5) = 0,bitParity(7) = 1
* Legal ops:& ^ | + > 可以使用的符号
x = ( x >> 16 ) ^ x;
x = ( x >> 8 ) ^ x;
x = ( x >> 4 ) ^ x;
x = ( x >> 2 ) ^ x;
x = ( x >> 1) ^ x;
return (x & 1);
}
完全看不懂,我对bit的了解太模糊了,越基础越好,越详细越好,为什么要移位,这个方法的原理是什么?而且我带进去得出来的答案和问的相反.
▼优质解答
答案和解析
理解这段代码的要点在于搞明白三个操作符:
移位>>:向右移动指定的位数,最右边挤掉相应的位数会被丢弃,而左边补0;
按位异或^:两个数按位进行异或运算,若对应的两位不同(即一个为0,另一个为1),返回1;否则(即同为0或同为1)返回0.
按位与&:两个整数按位进行与运算,例如 x&1得到的结果是取出x的最右一位.
明白了这两个操作符,后面就容易理解了:
x = ( x >> 16 ) ^ x; 这一句把高16位右移16位,和低16位进行按位异或运算,这样就会消掉偶数个数的1(两个相同位置的1会得到0).需要注意的是,计算是按照32位整数进行的,但是高16位的结果我们并不关心,因为原整数究竟有奇数或是偶数个1的信息已经完全反映在低16位里面了.
x = ( x >> 8 ) ^ x; 这一句进一步把低16位里面的左边8位右移并与右边8位进行异或运算.类似的,运算仍然是按照32位整数进行的,但是我们只关心最右边的8位,经过这一步运算后,又会消掉偶数个1.
x = ( x >> 4 ) ^ x; 后面依此类推.
x = ( x >> 2 ) ^ x;
x = ( x >> 1) ^ x; 直到这一步,我们把原32位整数包含1的个数奇偶性信息最终体现在最右边的1位上面.
return (x & 1); 通过按位与运算,把最后一位取出并返回.
就整个算法而言,你可以这样来理把32位整数折叠成为两个16位整数进行运算,各对应bit若同为1则结果为0,有一个为1则结果为1,同为0结果也为0,所以折叠的结果会消除偶数个1,不改变奇偶性信息.然后再折叠得到8位数、4位数、2位数,最后得到的1位数就是奇偶校验位了.
哦对了,题目说的是“奇数个0”,这个和“奇数个1”是一样的,原因不用解释了吧?
移位>>:向右移动指定的位数,最右边挤掉相应的位数会被丢弃,而左边补0;
按位异或^:两个数按位进行异或运算,若对应的两位不同(即一个为0,另一个为1),返回1;否则(即同为0或同为1)返回0.
按位与&:两个整数按位进行与运算,例如 x&1得到的结果是取出x的最右一位.
明白了这两个操作符,后面就容易理解了:
x = ( x >> 16 ) ^ x; 这一句把高16位右移16位,和低16位进行按位异或运算,这样就会消掉偶数个数的1(两个相同位置的1会得到0).需要注意的是,计算是按照32位整数进行的,但是高16位的结果我们并不关心,因为原整数究竟有奇数或是偶数个1的信息已经完全反映在低16位里面了.
x = ( x >> 8 ) ^ x; 这一句进一步把低16位里面的左边8位右移并与右边8位进行异或运算.类似的,运算仍然是按照32位整数进行的,但是我们只关心最右边的8位,经过这一步运算后,又会消掉偶数个1.
x = ( x >> 4 ) ^ x; 后面依此类推.
x = ( x >> 2 ) ^ x;
x = ( x >> 1) ^ x; 直到这一步,我们把原32位整数包含1的个数奇偶性信息最终体现在最右边的1位上面.
return (x & 1); 通过按位与运算,把最后一位取出并返回.
就整个算法而言,你可以这样来理把32位整数折叠成为两个16位整数进行运算,各对应bit若同为1则结果为0,有一个为1则结果为1,同为0结果也为0,所以折叠的结果会消除偶数个1,不改变奇偶性信息.然后再折叠得到8位数、4位数、2位数,最后得到的1位数就是奇偶校验位了.
哦对了,题目说的是“奇数个0”,这个和“奇数个1”是一样的,原因不用解释了吧?
看了 不使用循环计算32位整数的奇...的网友还看了以下:
qiou.sududian0,2,51,5.6,1\4,7.5()自然数()整数()偶数()奇数2 2020-04-09 …
5道数学题,用数字01234能组成及格没有重复数字的偶数?1、用数字0、1、2、3、4能组成()个 2020-04-09 …
谁能帮我用英文翻译下下面几句话我理想中的生活,就是去租一间空房子,只有我一个人住,想睡到什么时候起 2020-05-17 …
1.总领全文的一句是:2.点名浏览路线的一句是:3.写水清澈的句子是:4.用工整对偶写水流之急的是 2020-06-22 …
初一数学题,请进,急急急,谢谢1.所有偶数都可以表示成2n(n为整数)的形式,所有的奇数都可以表示 2020-07-02 …
两题VB题!1.利用for循环产生10个50至100之间的随机整数,打印出其中的偶数(注:偶数mo 2020-07-10 …
怎样证明任意一个正整数通过这个运算都会得到1对于任意正整数,如果是奇数,把它乘3加1,如是偶数,则 2020-07-23 …
怎样证明任意一个正整数通过这个运算都会得到1对于任意正整数,如果是奇数,把它乘3加1,如是偶数,则 2020-07-23 …
(1)用1、2、3、4、5、6、7可组成多少个无重复数字的四位数且四位数为偶数;(2)用0、1、2、 2020-11-03 …
判断:已知A=Z,B={1,-1},n为奇数时,f(n)=-1,n为偶数时,f(n)=1,那么上述对 2020-11-17 …