ビット列の誤り検知を目的として追加されるパリティビット。
バリティビットの追加方法は、ビット列の1の個数が常に奇数になるように追加する「奇数パリティ」、常に偶数になるように追加する偶数パリティの2通りがあります。
今回は文字列中に含まれる1の数をカウントし、その結果に応じて0もしくは1を追加する処理について、C#、Java、JavaScript、PHP、Python、Rubyの6言語で書いています。
奇数パリティ追加処理を行う関数parity_odd()の場合は、文字列中の1の個数がが常に奇数になるように0または1を追加し、偶数パリティ追加処理を行う関数pparity_even()の場合は、文字列中の1の個数が常に偶数になるように0または1を追加します。
なお、文字列中に0と1以外の文字が含まれている場合は、それらの文字を空白文字に変換してカットする処理を行います。
今回の処理で使用する文字列は「1011001」で、parity_odd()で「11011001」を、parity_even()で「01011001」を、それぞれ出力します。
C#
using System;
using System.Text.RegularExpressions;
public class Sample{
//奇数パリティ
public static string parity_odd(string str){
string new_str = "";
Regex reg = new Regex("[^0-1]");
str = reg.Replace(str, "");
int count = str.Split('1').Length - 1;
if (count % 2 == 1){
new_str = '0' + str;
} else {
new_str = '1' + str;
}
return new_str;
}
//偶数パリティ
public static string parity_even(string str){
string new_str = "";
Regex reg = new Regex("[^0-1]");
str = reg.Replace(str, "");
int count = str.Split('1').Length - 1;
if (count % 2 == 0){
new_str = '0' + str;
} else {
new_str = '1' + str;
}
return new_str;
}
public static void Main(){
var line = "1011001";
Console.WriteLine(parity_odd(line));
Console.WriteLine(parity_even(line));
}
}
Java
import java.util.*;
public class Main {
//奇数パリティ
public static String parity_odd(String str) {
String new_str = "";
str = str.replaceAll("[^0-1]", "");
int count = str.split("1").length - 1;
if (count % 2 == 1){
new_str = '0' + str;
} else {
new_str = '1' + str;
}
return new_str;
}
//偶数パリティ
public static String parity_even(String str) {
String new_str = "";
str = str.replaceAll("[^0-1]", "");
int count = str.split("1").length - 1;
if (count % 2 == 0){
new_str = '0' + str;
} else {
new_str = '1' + str;
}
return new_str;
}
public static void main(String[] args) throws Exception {
var line = "1011001";
System.out.println(parity_odd(line));
System.out.println(parity_even(line));
}
}
JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');
//奇数パリティ
function parity_odd(str){
var new_str = "";
str = str.replace(/[^0-1]/g, '');
var count = str.split('1').length - 1;
if (count % 2 == 1){
new_str = '0' + str;
} else {
new_str = '1' + str;
}
return new_str;
}
//偶数パリティ
function parity_even(str){
var new_str = "";
str = str.replace(/[^0-1]/g, '');
var count = str.split('1').length - 1;
if (count % 2 == 0){
new_str = '0' + str;
} else {
new_str = '1' + str;
}
return new_str;
}
var line = "1011001";
console.log(parity_odd(line));
console.log(parity_even(line));
PHP
<?php
//奇数パリティ
function parity_odd($str){
$new_str = "";
$str = preg_replace('/[^0-1]/','', $str);
if (substr_count($str, '1') % 2 == 1){
$new_str = '0'.$str;
} else {
$new_str = '1'.$str;
}
return $new_str;
}
//偶数パリティ
function parity_even($str){
$new_str = "";
$str = preg_replace('/[^0-1]/','', $str);
if (substr_count($str, '1') % 2 == 0){
$new_str = '0'.$str;
} else {
$new_str = '1'.$str;
}
return $new_str;
}
$line = "1011001";
echo parity_odd($line)."\n";
echo parity_even($line)."\n";
?>
Python3
import re
#奇数パリティ
def parity_odd(string):
new_str = ""
string = re.sub('[^0-1]', '', string)
if string.count("1") % 2 == 1:
new_str = "0" + string
else:
new_str = "1" + string
return new_str
#偶数パリティ
def parity_even(string):
new_str = ""
string = re.sub('[^0-1]', '', string)
if string.count("1") % 2 == 0:
new_str = "0" + string
else:
new_str = "1" + string
return new_str
line = "1011001"
print(parity_odd(line))
print(parity_even(line))
Ruby
#奇数パリティ
def parity_odd(str)
new_str = ""
str = str.gsub(/[^0-1]/, '')
if str.count('1') % 2 == 1
new_str = '0' + str
else
new_str = '1' + str
end
return new_str
end
#偶数パリティ
def parity_even(str)
new_str = ""
str = str.gsub(/[^0-1]/, '')
if str.count('1') % 2 == 0
new_str = '0' + str
else
new_str = '1' + str
end
return new_str
end
line = "1011001"
puts parity_odd(line)
puts parity_even(line)