奇偶校验:数字的奇偶校验是指它是否包含奇数或偶数个1位。如果该数字包含奇数个1位,则具有“奇校验”,如果包含偶数个1位,则具有“偶校验”。
以下解决方案的主要思想是–循环,当n不为0时,在循环中取消设置位之一并反转奇偶校验。
Algorithm: getParity(n)
1. Initialize parity = 0
2. Loop while n != 0
a. Invert parity
parity = !parity
b. Unset rightmost set bit
n = n & (n-1)
3. return parity
Example:
Initialize: n = 13 (1101) parity = 0
n = 13 & 12 = 12 (1100) parity = 1
n = 12 & 11 = 8 (1000) parity = 0
n = 8 & 7 = 0 (0000) parity = 1
程序:
C++
// C++ program to find parity
// of an integer
# include
# define bool int
using namespace std;
// Function to get parity of number n. It returns 1
// if n has odd parity, and returns 0 if n has even
// parity
bool getParity(unsigned int n)
{
bool parity = 0;
while (n)
{
parity = !parity;
n = n & (n - 1);
}
return parity;
}
/* Driver program to test getParity() */
int main()
{
unsigned int n = 7;
cout<<"Parity of no "<
C
// C program to find parity
// of an integer
# include
# define bool int
/* Function to get parity of number n. It returns 1
if n has odd parity, and returns 0 if n has even
parity */
bool getParity(unsigned int n)
{
bool parity = 0;
while (n)
{
parity = !parity;
n = n & (n - 1);
}
return parity;
}
/* Driver program to test getParity() */
int main()
{
unsigned int n = 7;
printf("Parity of no %d = %s", n,
(getParity(n)? "odd": "even"));
getchar();
return 0;
}
Java
// Java program to find parity
// of an integer
import java.util.*;
import java.lang.*;
import java.io.*;
import java.math.BigInteger;
class GFG
{
/* Function to get parity of number n.
It returns 1 if n has odd parity, and
returns 0 if n has even parity */
static boolean getParity(int n)
{
boolean parity = false;
while(n != 0)
{
parity = !parity;
n = n & (n-1);
}
return parity;
}
/* Driver program to test getParity() */
public static void main (String[] args)
{
int n = 12;
System.out.println("Parity of no " + n + " = " +
(getParity(n)? "odd": "even"));
}
}
/* This code is contributed by Amit khandelwal*/
Python3
# Python3 code to get parity.
# Function to get parity of number n.
# It returns 1 if n has odd parity,
# and returns 0 if n has even parity
def getParity( n ):
parity = 0
while n:
parity = ~parity
n = n & (n - 1)
return parity
# Driver program to test getParity()
n = 7
print ("Parity of no ", n," = ",
( "odd" if getParity(n) else "even"))
# This code is contributed by "Sharad_Bhardwaj".
C#
// C# program to find parity of an integer
using System;
class GFG {
/* Function to get parity of number n.
It returns 1 if n has odd parity, and
returns 0 if n has even parity */
static bool getParity(int n)
{
bool parity = false;
while(n != 0)
{
parity = !parity;
n = n & (n-1);
}
return parity;
}
// Driver code
public static void Main ()
{
int n = 7;
Console.Write("Parity of no " + n
+ " = " + (getParity(n)?
"odd": "even"));
}
}
// This code is contributed by nitin mittal.
PHP
Javascript
输出:
Parity of no 7 = odd
通过使用查找表可以优化上述解决方案。有关详细信息,请参阅Bit Twiddle Hacks [1st reference]。
时间复杂度:以上算法所花费的时间与设置的位数成正比。最糟糕的情况是O(Log n)。
用途:奇偶校验用于错误检测和加密。
使用XOR和表查找计算数字的奇偶校验
参考:
http://graphics.stanford.edu/~seander/bithacks.html#ParityNaive –最后检查日期为2009年5月30日。