8 # ======================================================================
9 # $carry_out = $vector1->add($vector2,$vector3,$carry_in);
10 # ======================================================================
16 $result0{'FE'}{'FE'} = 'FC'; $carry0{'FE'}{'FE'} = 1;
17 $result0{'FE'}{'FF'} = 'FD'; $carry0{'FE'}{'FF'} = 1;
18 $result0{'FE'}{'00'} = 'FE'; $carry0{'FE'}{'00'} = 0;
19 $result0{'FE'}{'01'} = 'FF'; $carry0{'FE'}{'01'} = 0;
20 $result0{'FE'}{'02'} = '00'; $carry0{'FE'}{'02'} = 1;
22 $result0{'FF'}{'FE'} = 'FD'; $carry0{'FF'}{'FE'} = 1;
23 $result0{'FF'}{'FF'} = 'FE'; $carry0{'FF'}{'FF'} = 1;
24 $result0{'FF'}{'00'} = 'FF'; $carry0{'FF'}{'00'} = 0;
25 $result0{'FF'}{'01'} = '00'; $carry0{'FF'}{'01'} = 1;
26 $result0{'FF'}{'02'} = '01'; $carry0{'FF'}{'02'} = 1;
28 $result0{'00'}{'FE'} = 'FE'; $carry0{'00'}{'FE'} = 0;
29 $result0{'00'}{'FF'} = 'FF'; $carry0{'00'}{'FF'} = 0;
30 $result0{'00'}{'00'} = '00'; $carry0{'00'}{'00'} = 0;
31 $result0{'00'}{'01'} = '01'; $carry0{'00'}{'01'} = 0;
32 $result0{'00'}{'02'} = '02'; $carry0{'00'}{'02'} = 0;
34 $result0{'01'}{'FE'} = 'FF'; $carry0{'01'}{'FE'} = 0;
35 $result0{'01'}{'FF'} = '00'; $carry0{'01'}{'FF'} = 1;
36 $result0{'01'}{'00'} = '01'; $carry0{'01'}{'00'} = 0;
37 $result0{'01'}{'01'} = '02'; $carry0{'01'}{'01'} = 0;
38 $result0{'01'}{'02'} = '03'; $carry0{'01'}{'02'} = 0;
40 $result0{'02'}{'FE'} = '00'; $carry0{'02'}{'FE'} = 1;
41 $result0{'02'}{'FF'} = '01'; $carry0{'02'}{'FF'} = 1;
42 $result0{'02'}{'00'} = '02'; $carry0{'02'}{'00'} = 0;
43 $result0{'02'}{'01'} = '03'; $carry0{'02'}{'01'} = 0;
44 $result0{'02'}{'02'} = '04'; $carry0{'02'}{'02'} = 0;
46 $result1{'FE'}{'FE'} = 'FD'; $carry1{'FE'}{'FE'} = 1;
47 $result1{'FE'}{'FF'} = 'FE'; $carry1{'FE'}{'FF'} = 1;
48 $result1{'FE'}{'00'} = 'FF'; $carry1{'FE'}{'00'} = 0;
49 $result1{'FE'}{'01'} = '00'; $carry1{'FE'}{'01'} = 1;
50 $result1{'FE'}{'02'} = '01'; $carry1{'FE'}{'02'} = 1;
52 $result1{'FF'}{'FE'} = 'FE'; $carry1{'FF'}{'FE'} = 1;
53 $result1{'FF'}{'FF'} = 'FF'; $carry1{'FF'}{'FF'} = 1;
54 $result1{'FF'}{'00'} = '00'; $carry1{'FF'}{'00'} = 1;
55 $result1{'FF'}{'01'} = '01'; $carry1{'FF'}{'01'} = 1;
56 $result1{'FF'}{'02'} = '02'; $carry1{'FF'}{'02'} = 1;
58 $result1{'00'}{'FE'} = 'FF'; $carry1{'00'}{'FE'} = 0;
59 $result1{'00'}{'FF'} = '00'; $carry1{'00'}{'FF'} = 1;
60 $result1{'00'}{'00'} = '01'; $carry1{'00'}{'00'} = 0;
61 $result1{'00'}{'01'} = '02'; $carry1{'00'}{'01'} = 0;
62 $result1{'00'}{'02'} = '03'; $carry1{'00'}{'02'} = 0;
64 $result1{'01'}{'FE'} = '00'; $carry1{'01'}{'FE'} = 1;
65 $result1{'01'}{'FF'} = '01'; $carry1{'01'}{'FF'} = 1;
66 $result1{'01'}{'00'} = '02'; $carry1{'01'}{'00'} = 0;
67 $result1{'01'}{'01'} = '03'; $carry1{'01'}{'01'} = 0;
68 $result1{'01'}{'02'} = '04'; $carry1{'01'}{'02'} = 0;
70 $result1{'02'}{'FE'} = '01'; $carry1{'02'}{'FE'} = 1;
71 $result1{'02'}{'FF'} = '02'; $carry1{'02'}{'FF'} = 1;
72 $result1{'02'}{'00'} = '03'; $carry1{'02'}{'00'} = 0;
73 $result1{'02'}{'01'} = '04'; $carry1{'02'}{'01'} = 0;
74 $result1{'02'}{'02'} = '05'; $carry1{'02'}{'02'} = 0;
76 foreach $bits (31, 32, 33, 63, 64, 65, 127, 128, 129, 997)
78 $vec0 = Bit::Vector->new($bits);
79 $vec1 = Bit::Vector->new($bits);
80 $vec2 = Bit::Vector->new($bits);
81 $vec3 = Bit::Vector->new($bits);
83 foreach $arg1 (sort hexadecimal (keys %result0))
85 foreach $arg2 (sort hexadecimal (keys %{$result0{$arg1}}))
87 # print "add '$arg1' + '$arg2'\n";
88 $vec1->from_Hex(convert($arg1));
89 $vec2->from_Hex(convert($arg2));
90 $vec3->from_Hex(convert($result0{$arg1}{$arg2}));
91 $carry3 = $carry0{$arg1}{$arg2};
92 $carry0 = $vec0->add($vec1,$vec2,0);
93 # print "Result: '", $vec0->to_Hex(), "' $carry0\n";
94 # print "Should be: '", $vec3->to_Hex(), "' $carry3\n";
95 if ($vec0->equal($vec3))
96 {print "ok $n\n";} else {print "not ok $n\n";}
98 if ($carry0 == $carry3)
99 {print "ok $n\n";} else {print "not ok $n\n";}
104 foreach $arg1 (sort hexadecimal (keys %result0))
106 foreach $arg2 (sort hexadecimal (keys %{$result0{$arg1}}))
108 # print "add '$arg1' + '$arg2' + 1\n";
109 $vec1->from_Hex(convert($arg1));
110 $vec2->from_Hex(convert($arg2));
111 $vec3->from_Hex(convert($result1{$arg1}{$arg2}));
112 $carry3 = $carry1{$arg1}{$arg2};
113 $carry0 = $vec0->add($vec1,$vec2,1);
114 # print "Result: '", $vec0->to_Hex(), "' $carry0\n";
115 # print "Should be: '", $vec3->to_Hex(), "' $carry3\n";
116 if ($vec0->equal($vec3))
117 {print "ok $n\n";} else {print "not ok $n\n";}
119 if ($carry0 == $carry3)
120 {print "ok $n\n";} else {print "not ok $n\n";}
126 $vec = Bit::Vector->new(1024);
127 $vec->add($vec,$vec,5);
129 if ($vec->is_empty())
130 {print "ok $n\n";} else {print "not ok $n\n";}
137 my($x,$y) = (hex($a),hex($b));
139 if ($x > 127) { $x -= 256; }
140 if ($y > 127) { $y -= 256; }
148 my($dec) = hex($hex);
151 $len = int($bits / 4);
152 if ($len * 4 < $bits) { $len++; }
155 if ($dec > 127) { return( ('F' x $len) . $hex ); }
156 else { return( ('0' x $len) . $hex ); }