sc_nbcommon.inc revision 12027
112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de/***************************************************************************** 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de sc_nbcommon.cpp -- Functions common to both sc_signed and sc_unsigned. 2312027Sjungma@eit.uni-kl.de This file is included in sc_signed.cpp and 2412027Sjungma@eit.uni-kl.de sc_unsigned.cpp after the macros are defined accordingly. 2512027Sjungma@eit.uni-kl.de For example, sc_signed.cpp will first define CLASS_TYPE 2612027Sjungma@eit.uni-kl.de as sc_signed before including this file. This file like 2712027Sjungma@eit.uni-kl.de sc_nbfriends.cpp and sc_nbexterns.cpp is created in order 2812027Sjungma@eit.uni-kl.de to ensure only one version of each function, regardless 2912027Sjungma@eit.uni-kl.de of the class that they interface to. 3012027Sjungma@eit.uni-kl.de 3112027Sjungma@eit.uni-kl.de Original Author: Ali Dasdan, Synopsys, Inc. 3212027Sjungma@eit.uni-kl.de 3312027Sjungma@eit.uni-kl.de *****************************************************************************/ 3412027Sjungma@eit.uni-kl.de 3512027Sjungma@eit.uni-kl.de/***************************************************************************** 3612027Sjungma@eit.uni-kl.de 3712027Sjungma@eit.uni-kl.de MODIFICATION LOG - modifiers, enter your name, affiliation, date and 3812027Sjungma@eit.uni-kl.de changes you are making here. 3912027Sjungma@eit.uni-kl.de 4012027Sjungma@eit.uni-kl.de Name, Affiliation, Date: 4112027Sjungma@eit.uni-kl.de Description of Modification: 4212027Sjungma@eit.uni-kl.de 4312027Sjungma@eit.uni-kl.de *****************************************************************************/ 4412027Sjungma@eit.uni-kl.de 4512027Sjungma@eit.uni-kl.de 4612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 4712027Sjungma@eit.uni-kl.de// SECTION : Public members 4812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 4912027Sjungma@eit.uni-kl.de 5012027Sjungma@eit.uni-kl.de// Create a CLASS_TYPE number with nb bits. 5112027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE( int nb ) : 5212027Sjungma@eit.uni-kl.de sc_value_base(), sgn(), nbits(), ndigits(), digit() 5312027Sjungma@eit.uni-kl.de{ 5412027Sjungma@eit.uni-kl.de sgn = default_sign(); 5512027Sjungma@eit.uni-kl.de if( nb > 0 ) { 5612027Sjungma@eit.uni-kl.de nbits = num_bits( nb ); 5712027Sjungma@eit.uni-kl.de } else { 5812027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 5912027Sjungma@eit.uni-kl.de std::sprintf( msg, "%s::%s( int nb ) : nb = %d is not valid", 6012027Sjungma@eit.uni-kl.de CLASS_TYPE_STR, CLASS_TYPE_STR, nb ); 6112027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg ); 6212027Sjungma@eit.uni-kl.de } 6312027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 6412027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 6512027Sjungma@eit.uni-kl.de test_bound(nb); 6612027Sjungma@eit.uni-kl.de#else 6712027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 6812027Sjungma@eit.uni-kl.de#endif 6912027Sjungma@eit.uni-kl.de makezero(); 7012027Sjungma@eit.uni-kl.de} 7112027Sjungma@eit.uni-kl.de 7212027Sjungma@eit.uni-kl.de 7312027Sjungma@eit.uni-kl.de// Create a copy of v with sgn s. v is of the same type. 7412027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const CLASS_TYPE& v) : 7512027Sjungma@eit.uni-kl.de sc_value_base(v), sgn(v.sgn), nbits(v.nbits), ndigits(v.ndigits), digit() 7612027Sjungma@eit.uni-kl.de{ 7712027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 7812027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 7912027Sjungma@eit.uni-kl.de#endif 8012027Sjungma@eit.uni-kl.de 8112027Sjungma@eit.uni-kl.de vec_copy(ndigits, digit, v.digit); 8212027Sjungma@eit.uni-kl.de} 8312027Sjungma@eit.uni-kl.de 8412027Sjungma@eit.uni-kl.de 8512027Sjungma@eit.uni-kl.de// Create a copy of v where v is of the different type. 8612027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const OTHER_CLASS_TYPE& v) : 8712027Sjungma@eit.uni-kl.de sc_value_base(v), sgn(v.sgn), nbits(num_bits(v.nbits)), ndigits(), digit() 8812027Sjungma@eit.uni-kl.de{ 8912027Sjungma@eit.uni-kl.de#if (IF_SC_SIGNED == 1) 9012027Sjungma@eit.uni-kl.de ndigits = v.ndigits; 9112027Sjungma@eit.uni-kl.de#else 9212027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 9312027Sjungma@eit.uni-kl.de#endif 9412027Sjungma@eit.uni-kl.de 9512027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 9612027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 9712027Sjungma@eit.uni-kl.de#endif 9812027Sjungma@eit.uni-kl.de 9912027Sjungma@eit.uni-kl.de copy_digits(v.nbits, v.ndigits, v.digit); 10012027Sjungma@eit.uni-kl.de} 10112027Sjungma@eit.uni-kl.de 10212027Sjungma@eit.uni-kl.de// Create a copy of v where v is an sign-less instance. 10312027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_bv_base& v) : 10412027Sjungma@eit.uni-kl.de sc_value_base(), sgn(), nbits(), ndigits(), digit() 10512027Sjungma@eit.uni-kl.de{ 10612027Sjungma@eit.uni-kl.de int nb = v.length(); 10712027Sjungma@eit.uni-kl.de sgn = default_sign(); 10812027Sjungma@eit.uni-kl.de if( nb > 0 ) { 10912027Sjungma@eit.uni-kl.de nbits = num_bits( nb ); 11012027Sjungma@eit.uni-kl.de } else { 11112027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 11212027Sjungma@eit.uni-kl.de std::sprintf( msg, "%s::%s( sc_bv_base ) : nb = %d is not valid", 11312027Sjungma@eit.uni-kl.de CLASS_TYPE_STR, CLASS_TYPE_STR, nb ); 11412027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg ); 11512027Sjungma@eit.uni-kl.de } 11612027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 11712027Sjungma@eit.uni-kl.de# ifdef SC_MAX_NBITS 11812027Sjungma@eit.uni-kl.de test_bound(nb); 11912027Sjungma@eit.uni-kl.de# else 12012027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 12112027Sjungma@eit.uni-kl.de# endif 12212027Sjungma@eit.uni-kl.de makezero(); 12312027Sjungma@eit.uni-kl.de *this = v; 12412027Sjungma@eit.uni-kl.de} 12512027Sjungma@eit.uni-kl.de 12612027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_lv_base& v) : 12712027Sjungma@eit.uni-kl.de sc_value_base(), sgn(), nbits(), ndigits(), digit() 12812027Sjungma@eit.uni-kl.de{ 12912027Sjungma@eit.uni-kl.de int nb = v.length(); 13012027Sjungma@eit.uni-kl.de sgn = default_sign(); 13112027Sjungma@eit.uni-kl.de if( nb > 0 ) { 13212027Sjungma@eit.uni-kl.de nbits = num_bits( nb ); 13312027Sjungma@eit.uni-kl.de } else { 13412027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 13512027Sjungma@eit.uni-kl.de std::sprintf( msg, "%s::%s( sc_lv_base ) : nb = %d is not valid", 13612027Sjungma@eit.uni-kl.de CLASS_TYPE_STR, CLASS_TYPE_STR, nb ); 13712027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg ); 13812027Sjungma@eit.uni-kl.de } 13912027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 14012027Sjungma@eit.uni-kl.de# ifdef SC_MAX_NBITS 14112027Sjungma@eit.uni-kl.de test_bound(nb); 14212027Sjungma@eit.uni-kl.de# else 14312027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 14412027Sjungma@eit.uni-kl.de# endif 14512027Sjungma@eit.uni-kl.de makezero(); 14612027Sjungma@eit.uni-kl.de *this = v; 14712027Sjungma@eit.uni-kl.de} 14812027Sjungma@eit.uni-kl.de 14912027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_int_subref_r& v) : 15012027Sjungma@eit.uni-kl.de sc_value_base(v), sgn(), nbits(), ndigits(), digit() 15112027Sjungma@eit.uni-kl.de{ 15212027Sjungma@eit.uni-kl.de int nb = v.length(); 15312027Sjungma@eit.uni-kl.de sgn = default_sign(); 15412027Sjungma@eit.uni-kl.de if( nb > 0 ) { 15512027Sjungma@eit.uni-kl.de nbits = num_bits( nb ); 15612027Sjungma@eit.uni-kl.de } else { 15712027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 15812027Sjungma@eit.uni-kl.de std::sprintf( msg, "%s::%s( sc_int_subref ) : nb = %d is not valid", 15912027Sjungma@eit.uni-kl.de CLASS_TYPE_STR, CLASS_TYPE_STR, nb ); 16012027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg ); 16112027Sjungma@eit.uni-kl.de } 16212027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 16312027Sjungma@eit.uni-kl.de# ifdef SC_MAX_NBITS 16412027Sjungma@eit.uni-kl.de test_bound(nb); 16512027Sjungma@eit.uni-kl.de# else 16612027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 16712027Sjungma@eit.uni-kl.de# endif 16812027Sjungma@eit.uni-kl.de makezero(); 16912027Sjungma@eit.uni-kl.de *this = v.to_uint64(); 17012027Sjungma@eit.uni-kl.de} 17112027Sjungma@eit.uni-kl.de 17212027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_uint_subref_r& v) : 17312027Sjungma@eit.uni-kl.de sc_value_base(v), sgn(), nbits(), ndigits(), digit() 17412027Sjungma@eit.uni-kl.de{ 17512027Sjungma@eit.uni-kl.de int nb = v.length(); 17612027Sjungma@eit.uni-kl.de sgn = default_sign(); 17712027Sjungma@eit.uni-kl.de if( nb > 0 ) { 17812027Sjungma@eit.uni-kl.de nbits = num_bits( nb ); 17912027Sjungma@eit.uni-kl.de } else { 18012027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 18112027Sjungma@eit.uni-kl.de std::sprintf( msg, "%s::%s( sc_uint_subref ) : nb = %d is not valid", 18212027Sjungma@eit.uni-kl.de CLASS_TYPE_STR, CLASS_TYPE_STR, nb ); 18312027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg ); 18412027Sjungma@eit.uni-kl.de } 18512027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 18612027Sjungma@eit.uni-kl.de# ifdef SC_MAX_NBITS 18712027Sjungma@eit.uni-kl.de test_bound(nb); 18812027Sjungma@eit.uni-kl.de# else 18912027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 19012027Sjungma@eit.uni-kl.de# endif 19112027Sjungma@eit.uni-kl.de makezero(); 19212027Sjungma@eit.uni-kl.de *this = v.to_uint64(); 19312027Sjungma@eit.uni-kl.de} 19412027Sjungma@eit.uni-kl.de 19512027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_signed_subref_r& v) : 19612027Sjungma@eit.uni-kl.de sc_value_base(v), sgn(), nbits(), ndigits(), digit() 19712027Sjungma@eit.uni-kl.de{ 19812027Sjungma@eit.uni-kl.de int nb = v.length(); 19912027Sjungma@eit.uni-kl.de sgn = default_sign(); 20012027Sjungma@eit.uni-kl.de if( nb > 0 ) { 20112027Sjungma@eit.uni-kl.de nbits = num_bits( nb ); 20212027Sjungma@eit.uni-kl.de } else { 20312027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 20412027Sjungma@eit.uni-kl.de std::sprintf( msg, "%s::%s( sc_signed_subref ) : nb = %d is not valid", 20512027Sjungma@eit.uni-kl.de CLASS_TYPE_STR, CLASS_TYPE_STR, nb ); 20612027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg ); 20712027Sjungma@eit.uni-kl.de } 20812027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 20912027Sjungma@eit.uni-kl.de# ifdef SC_MAX_NBITS 21012027Sjungma@eit.uni-kl.de test_bound(nb); 21112027Sjungma@eit.uni-kl.de# else 21212027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 21312027Sjungma@eit.uni-kl.de# endif 21412027Sjungma@eit.uni-kl.de makezero(); 21512027Sjungma@eit.uni-kl.de *this = sc_unsigned(v.m_obj_p, v.m_left, v.m_right); 21612027Sjungma@eit.uni-kl.de} 21712027Sjungma@eit.uni-kl.de 21812027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_unsigned_subref_r& v) : 21912027Sjungma@eit.uni-kl.de sc_value_base(v), sgn(), nbits(), ndigits(), digit() 22012027Sjungma@eit.uni-kl.de{ 22112027Sjungma@eit.uni-kl.de int nb = v.length(); 22212027Sjungma@eit.uni-kl.de sgn = default_sign(); 22312027Sjungma@eit.uni-kl.de if( nb > 0 ) { 22412027Sjungma@eit.uni-kl.de nbits = num_bits( nb ); 22512027Sjungma@eit.uni-kl.de } else { 22612027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 22712027Sjungma@eit.uni-kl.de std::sprintf( msg, "%s::%s( sc_unsigned_subref ) : nb = %d is not valid", 22812027Sjungma@eit.uni-kl.de CLASS_TYPE_STR, CLASS_TYPE_STR, nb ); 22912027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg ); 23012027Sjungma@eit.uni-kl.de } 23112027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 23212027Sjungma@eit.uni-kl.de# ifdef SC_MAX_NBITS 23312027Sjungma@eit.uni-kl.de test_bound(nb); 23412027Sjungma@eit.uni-kl.de# else 23512027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 23612027Sjungma@eit.uni-kl.de# endif 23712027Sjungma@eit.uni-kl.de makezero(); 23812027Sjungma@eit.uni-kl.de *this = sc_unsigned(v.m_obj_p, v.m_left, v.m_right); 23912027Sjungma@eit.uni-kl.de} 24012027Sjungma@eit.uni-kl.de 24112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 24212027Sjungma@eit.uni-kl.de// SECTION: Public members - Concatenation support. 24312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 24412027Sjungma@eit.uni-kl.de 24512027Sjungma@eit.uni-kl.de 24612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 24712027Sjungma@eit.uni-kl.de// SECTION: Public members - Assignment operators. 24812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 24912027Sjungma@eit.uni-kl.de 25012027Sjungma@eit.uni-kl.de// Assignment from v of the same type. 25112027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 25212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator=(const CLASS_TYPE& v) 25312027Sjungma@eit.uni-kl.de{ 25412027Sjungma@eit.uni-kl.de if (this != &v) { 25512027Sjungma@eit.uni-kl.de 25612027Sjungma@eit.uni-kl.de sgn = v.sgn; 25712027Sjungma@eit.uni-kl.de 25812027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) 25912027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 26012027Sjungma@eit.uni-kl.de 26112027Sjungma@eit.uni-kl.de else 26212027Sjungma@eit.uni-kl.de copy_digits(v.nbits, v.ndigits, v.digit); 26312027Sjungma@eit.uni-kl.de 26412027Sjungma@eit.uni-kl.de } 26512027Sjungma@eit.uni-kl.de 26612027Sjungma@eit.uni-kl.de return *this; 26712027Sjungma@eit.uni-kl.de} 26812027Sjungma@eit.uni-kl.de 26912027Sjungma@eit.uni-kl.de 27012027Sjungma@eit.uni-kl.de// Assignment from v of the different type. 27112027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 27212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator=(const OTHER_CLASS_TYPE& v) 27312027Sjungma@eit.uni-kl.de{ 27412027Sjungma@eit.uni-kl.de sgn = v.sgn; 27512027Sjungma@eit.uni-kl.de 27612027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) 27712027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 27812027Sjungma@eit.uni-kl.de 27912027Sjungma@eit.uni-kl.de else 28012027Sjungma@eit.uni-kl.de copy_digits(v.nbits, v.ndigits, v.digit); 28112027Sjungma@eit.uni-kl.de 28212027Sjungma@eit.uni-kl.de return *this; 28312027Sjungma@eit.uni-kl.de} 28412027Sjungma@eit.uni-kl.de 28512027Sjungma@eit.uni-kl.de 28612027Sjungma@eit.uni-kl.de// Assignment from an sc_unsigned_subref_r 28712027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 28812027Sjungma@eit.uni-kl.deCLASS_TYPE::operator=(const sc_unsigned_subref_r& v) 28912027Sjungma@eit.uni-kl.de{ 29012027Sjungma@eit.uni-kl.de return operator=(sc_unsigned(v)); 29112027Sjungma@eit.uni-kl.de} 29212027Sjungma@eit.uni-kl.de 29312027Sjungma@eit.uni-kl.de 29412027Sjungma@eit.uni-kl.de// Assignment from an sc_signed_subref_r 29512027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 29612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator=(const sc_signed_subref_r& v) 29712027Sjungma@eit.uni-kl.de{ 29812027Sjungma@eit.uni-kl.de return operator=(sc_unsigned(v)); 29912027Sjungma@eit.uni-kl.de} 30012027Sjungma@eit.uni-kl.de 30112027Sjungma@eit.uni-kl.de 30212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 30312027Sjungma@eit.uni-kl.de// SECTION: Input and output operators 30412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 30512027Sjungma@eit.uni-kl.de 30612027Sjungma@eit.uni-kl.devoid 30712027Sjungma@eit.uni-kl.deCLASS_TYPE::scan( ::std::istream& is ) 30812027Sjungma@eit.uni-kl.de{ 30912027Sjungma@eit.uni-kl.de std::string s; 31012027Sjungma@eit.uni-kl.de is >> s; 31112027Sjungma@eit.uni-kl.de *this = s.c_str(); 31212027Sjungma@eit.uni-kl.de} 31312027Sjungma@eit.uni-kl.de 31412027Sjungma@eit.uni-kl.de 31512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 31612027Sjungma@eit.uni-kl.de// SECTION: PLUS operators: +, +=, ++ 31712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 31812027Sjungma@eit.uni-kl.de 31912027Sjungma@eit.uni-kl.de// Cases to consider when computing u + v: 32012027Sjungma@eit.uni-kl.de// 1. 0 + v = v 32112027Sjungma@eit.uni-kl.de// 2. u + 0 = u 32212027Sjungma@eit.uni-kl.de// 3. if sgn(u) == sgn(v) 32312027Sjungma@eit.uni-kl.de// 3.1 u + v = +(u + v) = sgn(u) * (u + v) 32412027Sjungma@eit.uni-kl.de// 3.2 (-u) + (-v) = -(u + v) = sgn(u) * (u + v) 32512027Sjungma@eit.uni-kl.de// 4. if sgn(u) != sgn(v) 32612027Sjungma@eit.uni-kl.de// 4.1 u + (-v) = u - v = sgn(u) * (u - v) 32712027Sjungma@eit.uni-kl.de// 4.2 (-u) + v = -(u - v) ==> sgn(u) * (u - v) 32812027Sjungma@eit.uni-kl.de// 32912027Sjungma@eit.uni-kl.de// Specialization of above cases for computing ++u or u++: 33012027Sjungma@eit.uni-kl.de// 1. 0 + 1 = 1 33112027Sjungma@eit.uni-kl.de// 3. u + 1 = u + 1 = sgn(u) * (u + 1) 33212027Sjungma@eit.uni-kl.de// 4. (-u) + 1 = -(u - 1) = sgn(u) * (u - 1) 33312027Sjungma@eit.uni-kl.de 33412027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 33512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(const CLASS_TYPE& v) 33612027Sjungma@eit.uni-kl.de{ 33712027Sjungma@eit.uni-kl.de // u = *this 33812027Sjungma@eit.uni-kl.de 33912027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 34012027Sjungma@eit.uni-kl.de return (*this = v); 34112027Sjungma@eit.uni-kl.de 34212027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 2 34312027Sjungma@eit.uni-kl.de return *this; 34412027Sjungma@eit.uni-kl.de 34512027Sjungma@eit.uni-kl.de // cases 3 and 4 34612027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 34712027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 34812027Sjungma@eit.uni-kl.de 34912027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 35012027Sjungma@eit.uni-kl.de 35112027Sjungma@eit.uni-kl.de return *this; 35212027Sjungma@eit.uni-kl.de} 35312027Sjungma@eit.uni-kl.de 35412027Sjungma@eit.uni-kl.de 35512027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 35612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(const OTHER_CLASS_TYPE& v) 35712027Sjungma@eit.uni-kl.de{ 35812027Sjungma@eit.uni-kl.de // u = *this 35912027Sjungma@eit.uni-kl.de 36012027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 36112027Sjungma@eit.uni-kl.de return (*this = v); 36212027Sjungma@eit.uni-kl.de 36312027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 2 36412027Sjungma@eit.uni-kl.de return *this; 36512027Sjungma@eit.uni-kl.de 36612027Sjungma@eit.uni-kl.de // cases 3 and 4 36712027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 36812027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 36912027Sjungma@eit.uni-kl.de 37012027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 37112027Sjungma@eit.uni-kl.de 37212027Sjungma@eit.uni-kl.de return *this; 37312027Sjungma@eit.uni-kl.de} 37412027Sjungma@eit.uni-kl.de 37512027Sjungma@eit.uni-kl.de 37612027Sjungma@eit.uni-kl.deCLASS_TYPE& 37712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator++() // prefix 37812027Sjungma@eit.uni-kl.de{ 37912027Sjungma@eit.uni-kl.de *this = *this + 1; 38012027Sjungma@eit.uni-kl.de return *this; 38112027Sjungma@eit.uni-kl.de} 38212027Sjungma@eit.uni-kl.de 38312027Sjungma@eit.uni-kl.de 38412027Sjungma@eit.uni-kl.deconst CLASS_TYPE 38512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator++(int) // postfix 38612027Sjungma@eit.uni-kl.de{ 38712027Sjungma@eit.uni-kl.de // Copy digit into d. 38812027Sjungma@eit.uni-kl.de 38912027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 39012027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 39112027Sjungma@eit.uni-kl.de#else 39212027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[ndigits]; 39312027Sjungma@eit.uni-kl.de#endif 39412027Sjungma@eit.uni-kl.de 39512027Sjungma@eit.uni-kl.de small_type s = sgn; 39612027Sjungma@eit.uni-kl.de 39712027Sjungma@eit.uni-kl.de vec_copy(ndigits, d, digit); 39812027Sjungma@eit.uni-kl.de 39912027Sjungma@eit.uni-kl.de *this = *this + 1; 40012027Sjungma@eit.uni-kl.de 40112027Sjungma@eit.uni-kl.de return CLASS_TYPE(s, nbits, ndigits, d); 40212027Sjungma@eit.uni-kl.de} 40312027Sjungma@eit.uni-kl.de 40412027Sjungma@eit.uni-kl.de 40512027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 40612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(int64 v) 40712027Sjungma@eit.uni-kl.de{ 40812027Sjungma@eit.uni-kl.de // u = *this 40912027Sjungma@eit.uni-kl.de 41012027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 41112027Sjungma@eit.uni-kl.de return (*this = v); 41212027Sjungma@eit.uni-kl.de 41312027Sjungma@eit.uni-kl.de if (v == 0) // case 2 41412027Sjungma@eit.uni-kl.de return *this; 41512027Sjungma@eit.uni-kl.de 41612027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 41712027Sjungma@eit.uni-kl.de 41812027Sjungma@eit.uni-kl.de // cases 3 and 4 41912027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 42012027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 42112027Sjungma@eit.uni-kl.de 42212027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 42312027Sjungma@eit.uni-kl.de 42412027Sjungma@eit.uni-kl.de return *this; 42512027Sjungma@eit.uni-kl.de} 42612027Sjungma@eit.uni-kl.de 42712027Sjungma@eit.uni-kl.de 42812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 42912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(uint64 v) 43012027Sjungma@eit.uni-kl.de{ 43112027Sjungma@eit.uni-kl.de // u = *this 43212027Sjungma@eit.uni-kl.de 43312027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 43412027Sjungma@eit.uni-kl.de return (*this = v); 43512027Sjungma@eit.uni-kl.de 43612027Sjungma@eit.uni-kl.de if (v == 0) // case 2 43712027Sjungma@eit.uni-kl.de return *this; 43812027Sjungma@eit.uni-kl.de 43912027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 44012027Sjungma@eit.uni-kl.de 44112027Sjungma@eit.uni-kl.de // cases 3 and 4 44212027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 44312027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 44412027Sjungma@eit.uni-kl.de 44512027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 44612027Sjungma@eit.uni-kl.de 44712027Sjungma@eit.uni-kl.de return *this; 44812027Sjungma@eit.uni-kl.de} 44912027Sjungma@eit.uni-kl.de 45012027Sjungma@eit.uni-kl.de 45112027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 45212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(long v) 45312027Sjungma@eit.uni-kl.de{ 45412027Sjungma@eit.uni-kl.de // u = *this 45512027Sjungma@eit.uni-kl.de 45612027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 45712027Sjungma@eit.uni-kl.de return (*this = v); 45812027Sjungma@eit.uni-kl.de 45912027Sjungma@eit.uni-kl.de if (v == 0) // case 2 46012027Sjungma@eit.uni-kl.de return *this; 46112027Sjungma@eit.uni-kl.de 46212027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 46312027Sjungma@eit.uni-kl.de 46412027Sjungma@eit.uni-kl.de // cases 3 and 4 46512027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 46612027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 46712027Sjungma@eit.uni-kl.de 46812027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 46912027Sjungma@eit.uni-kl.de 47012027Sjungma@eit.uni-kl.de return *this; 47112027Sjungma@eit.uni-kl.de} 47212027Sjungma@eit.uni-kl.de 47312027Sjungma@eit.uni-kl.de 47412027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 47512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(unsigned long v) 47612027Sjungma@eit.uni-kl.de{ 47712027Sjungma@eit.uni-kl.de // u = *this 47812027Sjungma@eit.uni-kl.de 47912027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 48012027Sjungma@eit.uni-kl.de return (*this = v); 48112027Sjungma@eit.uni-kl.de 48212027Sjungma@eit.uni-kl.de if (v == 0) // case 2 48312027Sjungma@eit.uni-kl.de return *this; 48412027Sjungma@eit.uni-kl.de 48512027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 48612027Sjungma@eit.uni-kl.de 48712027Sjungma@eit.uni-kl.de // cases 3 and 4 48812027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 48912027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 49012027Sjungma@eit.uni-kl.de 49112027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 49212027Sjungma@eit.uni-kl.de 49312027Sjungma@eit.uni-kl.de return *this; 49412027Sjungma@eit.uni-kl.de} 49512027Sjungma@eit.uni-kl.de 49612027Sjungma@eit.uni-kl.de 49712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 49812027Sjungma@eit.uni-kl.de// SECTION: MINUS operators: -, -=, -- 49912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 50012027Sjungma@eit.uni-kl.de 50112027Sjungma@eit.uni-kl.de// Cases to consider when computing u + v: 50212027Sjungma@eit.uni-kl.de// 1. u - 0 = u 50312027Sjungma@eit.uni-kl.de// 2. 0 - v = -v 50412027Sjungma@eit.uni-kl.de// 3. if sgn(u) != sgn(v) 50512027Sjungma@eit.uni-kl.de// 3.1 u - (-v) = u + v = sgn(u) * (u + v) 50612027Sjungma@eit.uni-kl.de// 3.2 (-u) - v = -(u + v) ==> sgn(u) * (u + v) 50712027Sjungma@eit.uni-kl.de// 4. if sgn(u) == sgn(v) 50812027Sjungma@eit.uni-kl.de// 4.1 u - v = +(u - v) = sgn(u) * (u - v) 50912027Sjungma@eit.uni-kl.de// 4.2 (-u) - (-v) = -(u - v) = sgn(u) * (u - v) 51012027Sjungma@eit.uni-kl.de// 51112027Sjungma@eit.uni-kl.de// Specialization of above cases for computing --u or u--: 51212027Sjungma@eit.uni-kl.de// 1. 0 - 1 = -1 51312027Sjungma@eit.uni-kl.de// 3. (-u) - 1 = -(u + 1) = sgn(u) * (u + 1) 51412027Sjungma@eit.uni-kl.de// 4. u - 1 = u - 1 = sgn(u) * (u - 1) 51512027Sjungma@eit.uni-kl.de 51612027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 51712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(const CLASS_TYPE& v) 51812027Sjungma@eit.uni-kl.de{ 51912027Sjungma@eit.uni-kl.de // u = *this 52012027Sjungma@eit.uni-kl.de 52112027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 1 52212027Sjungma@eit.uni-kl.de return *this; 52312027Sjungma@eit.uni-kl.de 52412027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) { // case 2 52512027Sjungma@eit.uni-kl.de 52612027Sjungma@eit.uni-kl.de sgn = -v.sgn; 52712027Sjungma@eit.uni-kl.de copy_digits(v.nbits, v.ndigits, v.digit); 52812027Sjungma@eit.uni-kl.de 52912027Sjungma@eit.uni-kl.de } 53012027Sjungma@eit.uni-kl.de else { 53112027Sjungma@eit.uni-kl.de 53212027Sjungma@eit.uni-kl.de // cases 3 and 4 53312027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 53412027Sjungma@eit.uni-kl.de -v.sgn, v.nbits, v.ndigits, v.digit); 53512027Sjungma@eit.uni-kl.de 53612027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 53712027Sjungma@eit.uni-kl.de 53812027Sjungma@eit.uni-kl.de } 53912027Sjungma@eit.uni-kl.de 54012027Sjungma@eit.uni-kl.de return *this; 54112027Sjungma@eit.uni-kl.de} 54212027Sjungma@eit.uni-kl.de 54312027Sjungma@eit.uni-kl.de 54412027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 54512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(const OTHER_CLASS_TYPE& v) 54612027Sjungma@eit.uni-kl.de{ 54712027Sjungma@eit.uni-kl.de // u = *this 54812027Sjungma@eit.uni-kl.de 54912027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 1 55012027Sjungma@eit.uni-kl.de return *this; 55112027Sjungma@eit.uni-kl.de 55212027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) { // case 2 55312027Sjungma@eit.uni-kl.de 55412027Sjungma@eit.uni-kl.de sgn = -v.sgn; 55512027Sjungma@eit.uni-kl.de copy_digits(v.nbits, v.ndigits, v.digit); 55612027Sjungma@eit.uni-kl.de 55712027Sjungma@eit.uni-kl.de } 55812027Sjungma@eit.uni-kl.de else { 55912027Sjungma@eit.uni-kl.de 56012027Sjungma@eit.uni-kl.de // cases 3 and 4 56112027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 56212027Sjungma@eit.uni-kl.de -v.sgn, v.nbits, v.ndigits, v.digit); 56312027Sjungma@eit.uni-kl.de 56412027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 56512027Sjungma@eit.uni-kl.de 56612027Sjungma@eit.uni-kl.de } 56712027Sjungma@eit.uni-kl.de 56812027Sjungma@eit.uni-kl.de return *this; 56912027Sjungma@eit.uni-kl.de} 57012027Sjungma@eit.uni-kl.de 57112027Sjungma@eit.uni-kl.de 57212027Sjungma@eit.uni-kl.deCLASS_TYPE& 57312027Sjungma@eit.uni-kl.deCLASS_TYPE::operator--() // prefix 57412027Sjungma@eit.uni-kl.de{ 57512027Sjungma@eit.uni-kl.de *this = *this - 1; 57612027Sjungma@eit.uni-kl.de return *this; 57712027Sjungma@eit.uni-kl.de} 57812027Sjungma@eit.uni-kl.de 57912027Sjungma@eit.uni-kl.de 58012027Sjungma@eit.uni-kl.deconst CLASS_TYPE 58112027Sjungma@eit.uni-kl.deCLASS_TYPE::operator--(int) // postfix 58212027Sjungma@eit.uni-kl.de{ 58312027Sjungma@eit.uni-kl.de // Copy digit into d. 58412027Sjungma@eit.uni-kl.de 58512027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 58612027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 58712027Sjungma@eit.uni-kl.de#else 58812027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[ndigits]; 58912027Sjungma@eit.uni-kl.de#endif 59012027Sjungma@eit.uni-kl.de 59112027Sjungma@eit.uni-kl.de small_type s = sgn; 59212027Sjungma@eit.uni-kl.de 59312027Sjungma@eit.uni-kl.de vec_copy(ndigits, d, digit); 59412027Sjungma@eit.uni-kl.de 59512027Sjungma@eit.uni-kl.de *this = *this - 1; 59612027Sjungma@eit.uni-kl.de 59712027Sjungma@eit.uni-kl.de return CLASS_TYPE(s, nbits, ndigits, d); 59812027Sjungma@eit.uni-kl.de} 59912027Sjungma@eit.uni-kl.de 60012027Sjungma@eit.uni-kl.de 60112027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 60212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(int64 v) 60312027Sjungma@eit.uni-kl.de{ 60412027Sjungma@eit.uni-kl.de // u = *this 60512027Sjungma@eit.uni-kl.de 60612027Sjungma@eit.uni-kl.de if (v == 0) // case 1 60712027Sjungma@eit.uni-kl.de return *this; 60812027Sjungma@eit.uni-kl.de 60912027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 61012027Sjungma@eit.uni-kl.de return (*this = -v); 61112027Sjungma@eit.uni-kl.de 61212027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 61312027Sjungma@eit.uni-kl.de 61412027Sjungma@eit.uni-kl.de // cases 3 and 4 61512027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 61612027Sjungma@eit.uni-kl.de -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 61712027Sjungma@eit.uni-kl.de 61812027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 61912027Sjungma@eit.uni-kl.de 62012027Sjungma@eit.uni-kl.de return *this; 62112027Sjungma@eit.uni-kl.de} 62212027Sjungma@eit.uni-kl.de 62312027Sjungma@eit.uni-kl.de 62412027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 62512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(uint64 v) 62612027Sjungma@eit.uni-kl.de{ 62712027Sjungma@eit.uni-kl.de // u = *this 62812027Sjungma@eit.uni-kl.de 62912027Sjungma@eit.uni-kl.de if (v == 0) // case 1 63012027Sjungma@eit.uni-kl.de return *this; 63112027Sjungma@eit.uni-kl.de 63212027Sjungma@eit.uni-kl.de int64 v2 = (int64) v; 63312027Sjungma@eit.uni-kl.de 63412027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 63512027Sjungma@eit.uni-kl.de return (*this = -v2); 63612027Sjungma@eit.uni-kl.de 63712027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 63812027Sjungma@eit.uni-kl.de 63912027Sjungma@eit.uni-kl.de // cases 3 and 4 64012027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 64112027Sjungma@eit.uni-kl.de -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 64212027Sjungma@eit.uni-kl.de 64312027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 64412027Sjungma@eit.uni-kl.de 64512027Sjungma@eit.uni-kl.de return *this; 64612027Sjungma@eit.uni-kl.de} 64712027Sjungma@eit.uni-kl.de 64812027Sjungma@eit.uni-kl.de 64912027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 65012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(long v) 65112027Sjungma@eit.uni-kl.de{ 65212027Sjungma@eit.uni-kl.de // u = *this 65312027Sjungma@eit.uni-kl.de 65412027Sjungma@eit.uni-kl.de if (v == 0) // case 1 65512027Sjungma@eit.uni-kl.de return *this; 65612027Sjungma@eit.uni-kl.de 65712027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 65812027Sjungma@eit.uni-kl.de return (*this = -v); 65912027Sjungma@eit.uni-kl.de 66012027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 66112027Sjungma@eit.uni-kl.de 66212027Sjungma@eit.uni-kl.de // cases 3 and 4 66312027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 66412027Sjungma@eit.uni-kl.de -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 66512027Sjungma@eit.uni-kl.de 66612027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 66712027Sjungma@eit.uni-kl.de 66812027Sjungma@eit.uni-kl.de return *this; 66912027Sjungma@eit.uni-kl.de} 67012027Sjungma@eit.uni-kl.de 67112027Sjungma@eit.uni-kl.de 67212027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 67312027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(unsigned long v) 67412027Sjungma@eit.uni-kl.de{ 67512027Sjungma@eit.uni-kl.de // u = *this 67612027Sjungma@eit.uni-kl.de 67712027Sjungma@eit.uni-kl.de if (v == 0) // case 1 67812027Sjungma@eit.uni-kl.de return *this; 67912027Sjungma@eit.uni-kl.de 68012027Sjungma@eit.uni-kl.de long v2 = (long) v; 68112027Sjungma@eit.uni-kl.de 68212027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 68312027Sjungma@eit.uni-kl.de return (*this = -v2); 68412027Sjungma@eit.uni-kl.de 68512027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 68612027Sjungma@eit.uni-kl.de 68712027Sjungma@eit.uni-kl.de // cases 3 and 4 68812027Sjungma@eit.uni-kl.de add_on_help(sgn, nbits, ndigits, digit, 68912027Sjungma@eit.uni-kl.de -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 69012027Sjungma@eit.uni-kl.de 69112027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 69212027Sjungma@eit.uni-kl.de 69312027Sjungma@eit.uni-kl.de return *this; 69412027Sjungma@eit.uni-kl.de} 69512027Sjungma@eit.uni-kl.de 69612027Sjungma@eit.uni-kl.de 69712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 69812027Sjungma@eit.uni-kl.de// SECTION: MULTIPLICATION operators: *, *= 69912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 70012027Sjungma@eit.uni-kl.de 70112027Sjungma@eit.uni-kl.de// Cases to consider when computing u * v: 70212027Sjungma@eit.uni-kl.de// 1. u * 0 = 0 * v = 0 70312027Sjungma@eit.uni-kl.de// 2. 1 * v = v and -1 * v = -v 70412027Sjungma@eit.uni-kl.de// 3. u * 1 = u and u * -1 = -u 70512027Sjungma@eit.uni-kl.de// 4. u * v = u * v 70612027Sjungma@eit.uni-kl.de 70712027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 70812027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(const CLASS_TYPE& v) 70912027Sjungma@eit.uni-kl.de{ 71012027Sjungma@eit.uni-kl.de // u = *this 71112027Sjungma@eit.uni-kl.de 71212027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, v.sgn); 71312027Sjungma@eit.uni-kl.de 71412027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 71512027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 71612027Sjungma@eit.uni-kl.de 71712027Sjungma@eit.uni-kl.de else 71812027Sjungma@eit.uni-kl.de // cases 2-4 71912027Sjungma@eit.uni-kl.de MUL_ON_HELPER(sgn, nbits, ndigits, digit, 72012027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 72112027Sjungma@eit.uni-kl.de 72212027Sjungma@eit.uni-kl.de return *this; 72312027Sjungma@eit.uni-kl.de} 72412027Sjungma@eit.uni-kl.de 72512027Sjungma@eit.uni-kl.de 72612027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 72712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(const OTHER_CLASS_TYPE& v) 72812027Sjungma@eit.uni-kl.de{ 72912027Sjungma@eit.uni-kl.de // u = *this 73012027Sjungma@eit.uni-kl.de 73112027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, v.sgn); 73212027Sjungma@eit.uni-kl.de 73312027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 73412027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 73512027Sjungma@eit.uni-kl.de 73612027Sjungma@eit.uni-kl.de else 73712027Sjungma@eit.uni-kl.de // cases 2-4 73812027Sjungma@eit.uni-kl.de MUL_ON_HELPER(sgn, nbits, ndigits, digit, 73912027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 74012027Sjungma@eit.uni-kl.de 74112027Sjungma@eit.uni-kl.de return *this; 74212027Sjungma@eit.uni-kl.de} 74312027Sjungma@eit.uni-kl.de 74412027Sjungma@eit.uni-kl.de 74512027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 74612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(int64 v) 74712027Sjungma@eit.uni-kl.de{ 74812027Sjungma@eit.uni-kl.de // u = *this 74912027Sjungma@eit.uni-kl.de 75012027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, get_sign(v)); 75112027Sjungma@eit.uni-kl.de 75212027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 75312027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 75412027Sjungma@eit.uni-kl.de 75512027Sjungma@eit.uni-kl.de else { // cases 2-4 75612027Sjungma@eit.uni-kl.de 75712027Sjungma@eit.uni-kl.de CONVERT_INT64_2(v); 75812027Sjungma@eit.uni-kl.de 75912027Sjungma@eit.uni-kl.de MUL_ON_HELPER(sgn, nbits, ndigits, digit, 76012027Sjungma@eit.uni-kl.de BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 76112027Sjungma@eit.uni-kl.de 76212027Sjungma@eit.uni-kl.de } 76312027Sjungma@eit.uni-kl.de 76412027Sjungma@eit.uni-kl.de return *this; 76512027Sjungma@eit.uni-kl.de} 76612027Sjungma@eit.uni-kl.de 76712027Sjungma@eit.uni-kl.de 76812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 76912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(uint64 v) 77012027Sjungma@eit.uni-kl.de{ 77112027Sjungma@eit.uni-kl.de // u = *this 77212027Sjungma@eit.uni-kl.de 77312027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, get_sign(v)); 77412027Sjungma@eit.uni-kl.de 77512027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 77612027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 77712027Sjungma@eit.uni-kl.de 77812027Sjungma@eit.uni-kl.de else { // cases 2-4 77912027Sjungma@eit.uni-kl.de 78012027Sjungma@eit.uni-kl.de CONVERT_INT64_2(v); 78112027Sjungma@eit.uni-kl.de 78212027Sjungma@eit.uni-kl.de MUL_ON_HELPER(sgn, nbits, ndigits, digit, 78312027Sjungma@eit.uni-kl.de BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 78412027Sjungma@eit.uni-kl.de 78512027Sjungma@eit.uni-kl.de } 78612027Sjungma@eit.uni-kl.de 78712027Sjungma@eit.uni-kl.de return *this; 78812027Sjungma@eit.uni-kl.de} 78912027Sjungma@eit.uni-kl.de 79012027Sjungma@eit.uni-kl.de 79112027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 79212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(long v) 79312027Sjungma@eit.uni-kl.de{ 79412027Sjungma@eit.uni-kl.de // u = *this 79512027Sjungma@eit.uni-kl.de 79612027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, get_sign(v)); 79712027Sjungma@eit.uni-kl.de 79812027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 79912027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 80012027Sjungma@eit.uni-kl.de 80112027Sjungma@eit.uni-kl.de else { // cases 2-4 80212027Sjungma@eit.uni-kl.de 80312027Sjungma@eit.uni-kl.de CONVERT_LONG_2(v); 80412027Sjungma@eit.uni-kl.de 80512027Sjungma@eit.uni-kl.de MUL_ON_HELPER(sgn, nbits, ndigits, digit, 80612027Sjungma@eit.uni-kl.de BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 80712027Sjungma@eit.uni-kl.de 80812027Sjungma@eit.uni-kl.de } 80912027Sjungma@eit.uni-kl.de 81012027Sjungma@eit.uni-kl.de return *this; 81112027Sjungma@eit.uni-kl.de} 81212027Sjungma@eit.uni-kl.de 81312027Sjungma@eit.uni-kl.de 81412027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 81512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(unsigned long v) 81612027Sjungma@eit.uni-kl.de{ 81712027Sjungma@eit.uni-kl.de // u = *this 81812027Sjungma@eit.uni-kl.de 81912027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, get_sign(v)); 82012027Sjungma@eit.uni-kl.de 82112027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 1 82212027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 82312027Sjungma@eit.uni-kl.de 82412027Sjungma@eit.uni-kl.de else { // cases 2-4 82512027Sjungma@eit.uni-kl.de 82612027Sjungma@eit.uni-kl.de CONVERT_LONG_2(v); 82712027Sjungma@eit.uni-kl.de 82812027Sjungma@eit.uni-kl.de MUL_ON_HELPER(sgn, nbits, ndigits, digit, 82912027Sjungma@eit.uni-kl.de BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 83012027Sjungma@eit.uni-kl.de 83112027Sjungma@eit.uni-kl.de } 83212027Sjungma@eit.uni-kl.de 83312027Sjungma@eit.uni-kl.de return *this; 83412027Sjungma@eit.uni-kl.de} 83512027Sjungma@eit.uni-kl.de 83612027Sjungma@eit.uni-kl.de 83712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 83812027Sjungma@eit.uni-kl.de// SECTION: DIVISION operators: /, /= 83912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 84012027Sjungma@eit.uni-kl.de 84112027Sjungma@eit.uni-kl.de// Cases to consider when finding the quotient q = floor(u/v): 84212027Sjungma@eit.uni-kl.de// Note that u = q * v + r for r < q. 84312027Sjungma@eit.uni-kl.de// 1. 0 / 0 or u / 0 => error 84412027Sjungma@eit.uni-kl.de// 2. 0 / v => 0 = 0 * v + 0 84512027Sjungma@eit.uni-kl.de// 3. u / v && u = v => u = 1 * u + 0 - u or v can be 1 or -1 84612027Sjungma@eit.uni-kl.de// 4. u / v && u < v => u = 0 * v + u - u can be 1 or -1 84712027Sjungma@eit.uni-kl.de// 5. u / v && u > v => u = q * v + r - v can be 1 or -1 84812027Sjungma@eit.uni-kl.de 84912027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 85012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(const CLASS_TYPE& v) 85112027Sjungma@eit.uni-kl.de{ 85212027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, v.sgn); 85312027Sjungma@eit.uni-kl.de 85412027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) { 85512027Sjungma@eit.uni-kl.de 85612027Sjungma@eit.uni-kl.de div_by_zero(v.sgn); // case 1 85712027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 85812027Sjungma@eit.uni-kl.de 85912027Sjungma@eit.uni-kl.de } 86012027Sjungma@eit.uni-kl.de else // other cases 86112027Sjungma@eit.uni-kl.de DIV_ON_HELPER(sgn, nbits, ndigits, digit, 86212027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 86312027Sjungma@eit.uni-kl.de 86412027Sjungma@eit.uni-kl.de return *this; 86512027Sjungma@eit.uni-kl.de} 86612027Sjungma@eit.uni-kl.de 86712027Sjungma@eit.uni-kl.de 86812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 86912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(const OTHER_CLASS_TYPE& v) 87012027Sjungma@eit.uni-kl.de{ 87112027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, v.sgn); 87212027Sjungma@eit.uni-kl.de 87312027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) { 87412027Sjungma@eit.uni-kl.de 87512027Sjungma@eit.uni-kl.de div_by_zero(v.sgn); // case 1 87612027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 87712027Sjungma@eit.uni-kl.de 87812027Sjungma@eit.uni-kl.de } 87912027Sjungma@eit.uni-kl.de else // other cases 88012027Sjungma@eit.uni-kl.de DIV_ON_HELPER(sgn, nbits, ndigits, digit, 88112027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 88212027Sjungma@eit.uni-kl.de 88312027Sjungma@eit.uni-kl.de return *this; 88412027Sjungma@eit.uni-kl.de} 88512027Sjungma@eit.uni-kl.de 88612027Sjungma@eit.uni-kl.de 88712027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 88812027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(int64 v) 88912027Sjungma@eit.uni-kl.de{ 89012027Sjungma@eit.uni-kl.de // u = *this 89112027Sjungma@eit.uni-kl.de 89212027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, get_sign(v)); 89312027Sjungma@eit.uni-kl.de 89412027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) { 89512027Sjungma@eit.uni-kl.de 89612027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 89712027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 89812027Sjungma@eit.uni-kl.de 89912027Sjungma@eit.uni-kl.de } 90012027Sjungma@eit.uni-kl.de else { 90112027Sjungma@eit.uni-kl.de 90212027Sjungma@eit.uni-kl.de CONVERT_INT64_2(v); 90312027Sjungma@eit.uni-kl.de 90412027Sjungma@eit.uni-kl.de // other cases 90512027Sjungma@eit.uni-kl.de DIV_ON_HELPER(sgn, nbits, ndigits, digit, 90612027Sjungma@eit.uni-kl.de BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 90712027Sjungma@eit.uni-kl.de 90812027Sjungma@eit.uni-kl.de } 90912027Sjungma@eit.uni-kl.de 91012027Sjungma@eit.uni-kl.de return *this; 91112027Sjungma@eit.uni-kl.de} 91212027Sjungma@eit.uni-kl.de 91312027Sjungma@eit.uni-kl.de 91412027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 91512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(uint64 v) 91612027Sjungma@eit.uni-kl.de{ 91712027Sjungma@eit.uni-kl.de // u = *this 91812027Sjungma@eit.uni-kl.de 91912027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, get_sign(v)); 92012027Sjungma@eit.uni-kl.de 92112027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) { 92212027Sjungma@eit.uni-kl.de 92312027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 92412027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 92512027Sjungma@eit.uni-kl.de 92612027Sjungma@eit.uni-kl.de } 92712027Sjungma@eit.uni-kl.de else { 92812027Sjungma@eit.uni-kl.de 92912027Sjungma@eit.uni-kl.de CONVERT_INT64_2(v); 93012027Sjungma@eit.uni-kl.de 93112027Sjungma@eit.uni-kl.de // other cases 93212027Sjungma@eit.uni-kl.de DIV_ON_HELPER(sgn, nbits, ndigits, digit, 93312027Sjungma@eit.uni-kl.de BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 93412027Sjungma@eit.uni-kl.de 93512027Sjungma@eit.uni-kl.de } 93612027Sjungma@eit.uni-kl.de 93712027Sjungma@eit.uni-kl.de return *this; 93812027Sjungma@eit.uni-kl.de} 93912027Sjungma@eit.uni-kl.de 94012027Sjungma@eit.uni-kl.de 94112027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 94212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(long v) 94312027Sjungma@eit.uni-kl.de{ 94412027Sjungma@eit.uni-kl.de // u = *this 94512027Sjungma@eit.uni-kl.de 94612027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, get_sign(v)); 94712027Sjungma@eit.uni-kl.de 94812027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) { 94912027Sjungma@eit.uni-kl.de 95012027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 95112027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 95212027Sjungma@eit.uni-kl.de 95312027Sjungma@eit.uni-kl.de } 95412027Sjungma@eit.uni-kl.de else { 95512027Sjungma@eit.uni-kl.de 95612027Sjungma@eit.uni-kl.de CONVERT_LONG_2(v); 95712027Sjungma@eit.uni-kl.de 95812027Sjungma@eit.uni-kl.de // other cases 95912027Sjungma@eit.uni-kl.de DIV_ON_HELPER(sgn, nbits, ndigits, digit, 96012027Sjungma@eit.uni-kl.de BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 96112027Sjungma@eit.uni-kl.de 96212027Sjungma@eit.uni-kl.de } 96312027Sjungma@eit.uni-kl.de 96412027Sjungma@eit.uni-kl.de return *this; 96512027Sjungma@eit.uni-kl.de} 96612027Sjungma@eit.uni-kl.de 96712027Sjungma@eit.uni-kl.de 96812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 96912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(unsigned long v) 97012027Sjungma@eit.uni-kl.de{ 97112027Sjungma@eit.uni-kl.de // u = *this 97212027Sjungma@eit.uni-kl.de 97312027Sjungma@eit.uni-kl.de sgn = mul_signs(sgn, get_sign(v)); 97412027Sjungma@eit.uni-kl.de 97512027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) { 97612027Sjungma@eit.uni-kl.de 97712027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 97812027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 97912027Sjungma@eit.uni-kl.de 98012027Sjungma@eit.uni-kl.de } 98112027Sjungma@eit.uni-kl.de else { 98212027Sjungma@eit.uni-kl.de 98312027Sjungma@eit.uni-kl.de CONVERT_LONG_2(v); 98412027Sjungma@eit.uni-kl.de 98512027Sjungma@eit.uni-kl.de // other cases 98612027Sjungma@eit.uni-kl.de DIV_ON_HELPER(sgn, nbits, ndigits, digit, 98712027Sjungma@eit.uni-kl.de BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 98812027Sjungma@eit.uni-kl.de 98912027Sjungma@eit.uni-kl.de } 99012027Sjungma@eit.uni-kl.de 99112027Sjungma@eit.uni-kl.de return *this; 99212027Sjungma@eit.uni-kl.de} 99312027Sjungma@eit.uni-kl.de 99412027Sjungma@eit.uni-kl.de 99512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 99612027Sjungma@eit.uni-kl.de// SECTION: MOD operators: %, %=. 99712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 99812027Sjungma@eit.uni-kl.de 99912027Sjungma@eit.uni-kl.de// Cases to consider when finding the remainder r = u % v: 100012027Sjungma@eit.uni-kl.de// Note that u = q * v + r for r < q. 100112027Sjungma@eit.uni-kl.de// 1. 0 % 0 or u % 0 => error 100212027Sjungma@eit.uni-kl.de// 2. 0 % v => 0 = 0 * v + 0 100312027Sjungma@eit.uni-kl.de// 3. u % v && u = v => u = 1 * u + 0 - u or v can be 1 or -1 100412027Sjungma@eit.uni-kl.de// 4. u % v && u < v => u = 0 * v + u - u can be 1 or -1 100512027Sjungma@eit.uni-kl.de// 5. u % v && u > v => u = q * v + r - v can be 1 or -1 100612027Sjungma@eit.uni-kl.de 100712027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 100812027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(const CLASS_TYPE& v) 100912027Sjungma@eit.uni-kl.de{ 101012027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (v.sgn == SC_ZERO)) { 101112027Sjungma@eit.uni-kl.de 101212027Sjungma@eit.uni-kl.de div_by_zero(v.sgn); // case 1 101312027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 101412027Sjungma@eit.uni-kl.de 101512027Sjungma@eit.uni-kl.de } 101612027Sjungma@eit.uni-kl.de else // other cases 101712027Sjungma@eit.uni-kl.de MOD_ON_HELPER(sgn, nbits, ndigits, digit, 101812027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 101912027Sjungma@eit.uni-kl.de 102012027Sjungma@eit.uni-kl.de return *this; 102112027Sjungma@eit.uni-kl.de} 102212027Sjungma@eit.uni-kl.de 102312027Sjungma@eit.uni-kl.de 102412027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 102512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(const OTHER_CLASS_TYPE& v) 102612027Sjungma@eit.uni-kl.de{ 102712027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (v.sgn == SC_ZERO)) { 102812027Sjungma@eit.uni-kl.de 102912027Sjungma@eit.uni-kl.de div_by_zero(v.sgn); // case 1 103012027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 103112027Sjungma@eit.uni-kl.de 103212027Sjungma@eit.uni-kl.de } 103312027Sjungma@eit.uni-kl.de else // other cases 103412027Sjungma@eit.uni-kl.de MOD_ON_HELPER(sgn, nbits, ndigits, digit, 103512027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 103612027Sjungma@eit.uni-kl.de 103712027Sjungma@eit.uni-kl.de return *this; 103812027Sjungma@eit.uni-kl.de} 103912027Sjungma@eit.uni-kl.de 104012027Sjungma@eit.uni-kl.de 104112027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 104212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(int64 v) 104312027Sjungma@eit.uni-kl.de{ 104412027Sjungma@eit.uni-kl.de small_type vs = get_sign(v); 104512027Sjungma@eit.uni-kl.de 104612027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (vs == SC_ZERO)) { 104712027Sjungma@eit.uni-kl.de 104812027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 104912027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 105012027Sjungma@eit.uni-kl.de 105112027Sjungma@eit.uni-kl.de } 105212027Sjungma@eit.uni-kl.de else { 105312027Sjungma@eit.uni-kl.de 105412027Sjungma@eit.uni-kl.de CONVERT_INT64_2(v); 105512027Sjungma@eit.uni-kl.de 105612027Sjungma@eit.uni-kl.de // other cases 105712027Sjungma@eit.uni-kl.de MOD_ON_HELPER(sgn, nbits, ndigits, digit, 105812027Sjungma@eit.uni-kl.de BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 105912027Sjungma@eit.uni-kl.de 106012027Sjungma@eit.uni-kl.de } 106112027Sjungma@eit.uni-kl.de 106212027Sjungma@eit.uni-kl.de return *this; 106312027Sjungma@eit.uni-kl.de} 106412027Sjungma@eit.uni-kl.de 106512027Sjungma@eit.uni-kl.de 106612027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 106712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(uint64 v) 106812027Sjungma@eit.uni-kl.de{ 106912027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (v == 0)) { 107012027Sjungma@eit.uni-kl.de 107112027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 107212027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 107312027Sjungma@eit.uni-kl.de 107412027Sjungma@eit.uni-kl.de } 107512027Sjungma@eit.uni-kl.de else { 107612027Sjungma@eit.uni-kl.de 107712027Sjungma@eit.uni-kl.de CONVERT_INT64_2(v); 107812027Sjungma@eit.uni-kl.de 107912027Sjungma@eit.uni-kl.de // other cases 108012027Sjungma@eit.uni-kl.de MOD_ON_HELPER(sgn, nbits, ndigits, digit, 108112027Sjungma@eit.uni-kl.de BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 108212027Sjungma@eit.uni-kl.de 108312027Sjungma@eit.uni-kl.de } 108412027Sjungma@eit.uni-kl.de 108512027Sjungma@eit.uni-kl.de return *this; 108612027Sjungma@eit.uni-kl.de} 108712027Sjungma@eit.uni-kl.de 108812027Sjungma@eit.uni-kl.de 108912027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 109012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(long v) 109112027Sjungma@eit.uni-kl.de{ 109212027Sjungma@eit.uni-kl.de small_type vs = get_sign(v); 109312027Sjungma@eit.uni-kl.de 109412027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (vs == SC_ZERO)) { 109512027Sjungma@eit.uni-kl.de 109612027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 109712027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 109812027Sjungma@eit.uni-kl.de 109912027Sjungma@eit.uni-kl.de } 110012027Sjungma@eit.uni-kl.de else { 110112027Sjungma@eit.uni-kl.de 110212027Sjungma@eit.uni-kl.de CONVERT_LONG_2(v); 110312027Sjungma@eit.uni-kl.de 110412027Sjungma@eit.uni-kl.de // other cases 110512027Sjungma@eit.uni-kl.de MOD_ON_HELPER(sgn, nbits, ndigits, digit, 110612027Sjungma@eit.uni-kl.de BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 110712027Sjungma@eit.uni-kl.de 110812027Sjungma@eit.uni-kl.de } 110912027Sjungma@eit.uni-kl.de 111012027Sjungma@eit.uni-kl.de return *this; 111112027Sjungma@eit.uni-kl.de} 111212027Sjungma@eit.uni-kl.de 111312027Sjungma@eit.uni-kl.de 111412027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 111512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(unsigned long v) 111612027Sjungma@eit.uni-kl.de{ 111712027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (v == 0)) { 111812027Sjungma@eit.uni-kl.de 111912027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 112012027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); // case 2 112112027Sjungma@eit.uni-kl.de 112212027Sjungma@eit.uni-kl.de } 112312027Sjungma@eit.uni-kl.de else { 112412027Sjungma@eit.uni-kl.de 112512027Sjungma@eit.uni-kl.de CONVERT_LONG_2(v); 112612027Sjungma@eit.uni-kl.de 112712027Sjungma@eit.uni-kl.de // other cases 112812027Sjungma@eit.uni-kl.de MOD_ON_HELPER(sgn, nbits, ndigits, digit, 112912027Sjungma@eit.uni-kl.de BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 113012027Sjungma@eit.uni-kl.de 113112027Sjungma@eit.uni-kl.de } 113212027Sjungma@eit.uni-kl.de 113312027Sjungma@eit.uni-kl.de return *this; 113412027Sjungma@eit.uni-kl.de} 113512027Sjungma@eit.uni-kl.de 113612027Sjungma@eit.uni-kl.de 113712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 113812027Sjungma@eit.uni-kl.de// SECTION: Bitwise AND operators: &, &= 113912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 114012027Sjungma@eit.uni-kl.de 114112027Sjungma@eit.uni-kl.de// Cases to consider when computing u & v: 114212027Sjungma@eit.uni-kl.de// 1. u & 0 = 0 & v = 0 114312027Sjungma@eit.uni-kl.de// 2. u & v => sgn = + 114412027Sjungma@eit.uni-kl.de// 3. (-u) & (-v) => sgn = - 114512027Sjungma@eit.uni-kl.de// 4. u & (-v) => sgn = + 114612027Sjungma@eit.uni-kl.de// 5. (-u) & v => sgn = + 114712027Sjungma@eit.uni-kl.de 114812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 114912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(const CLASS_TYPE& v) 115012027Sjungma@eit.uni-kl.de{ 115112027Sjungma@eit.uni-kl.de // u = *this 115212027Sjungma@eit.uni-kl.de 115312027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1 115412027Sjungma@eit.uni-kl.de makezero(); 115512027Sjungma@eit.uni-kl.de 115612027Sjungma@eit.uni-kl.de else { // other cases 115712027Sjungma@eit.uni-kl.de 115812027Sjungma@eit.uni-kl.de and_on_help(sgn, nbits, ndigits, digit, 115912027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 116012027Sjungma@eit.uni-kl.de 116112027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 116212027Sjungma@eit.uni-kl.de 116312027Sjungma@eit.uni-kl.de } 116412027Sjungma@eit.uni-kl.de 116512027Sjungma@eit.uni-kl.de return *this; 116612027Sjungma@eit.uni-kl.de} 116712027Sjungma@eit.uni-kl.de 116812027Sjungma@eit.uni-kl.de 116912027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 117012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(const OTHER_CLASS_TYPE& v) 117112027Sjungma@eit.uni-kl.de{ 117212027Sjungma@eit.uni-kl.de // u = *this 117312027Sjungma@eit.uni-kl.de 117412027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1 117512027Sjungma@eit.uni-kl.de makezero(); 117612027Sjungma@eit.uni-kl.de 117712027Sjungma@eit.uni-kl.de else { // other cases 117812027Sjungma@eit.uni-kl.de 117912027Sjungma@eit.uni-kl.de and_on_help(sgn, nbits, ndigits, digit, 118012027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 118112027Sjungma@eit.uni-kl.de 118212027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 118312027Sjungma@eit.uni-kl.de 118412027Sjungma@eit.uni-kl.de } 118512027Sjungma@eit.uni-kl.de 118612027Sjungma@eit.uni-kl.de return *this; 118712027Sjungma@eit.uni-kl.de} 118812027Sjungma@eit.uni-kl.de 118912027Sjungma@eit.uni-kl.de 119012027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 119112027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(int64 v) 119212027Sjungma@eit.uni-kl.de{ 119312027Sjungma@eit.uni-kl.de // u = *this 119412027Sjungma@eit.uni-kl.de 119512027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (v == 0)) // case 1 119612027Sjungma@eit.uni-kl.de makezero(); 119712027Sjungma@eit.uni-kl.de 119812027Sjungma@eit.uni-kl.de else { // other cases 119912027Sjungma@eit.uni-kl.de 120012027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 120112027Sjungma@eit.uni-kl.de 120212027Sjungma@eit.uni-kl.de and_on_help(sgn, nbits, ndigits, digit, 120312027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 120412027Sjungma@eit.uni-kl.de 120512027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 120612027Sjungma@eit.uni-kl.de 120712027Sjungma@eit.uni-kl.de } 120812027Sjungma@eit.uni-kl.de 120912027Sjungma@eit.uni-kl.de return *this; 121012027Sjungma@eit.uni-kl.de} 121112027Sjungma@eit.uni-kl.de 121212027Sjungma@eit.uni-kl.de 121312027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 121412027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(uint64 v) 121512027Sjungma@eit.uni-kl.de{ 121612027Sjungma@eit.uni-kl.de // u = *this 121712027Sjungma@eit.uni-kl.de 121812027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (v == 0)) // case 1 121912027Sjungma@eit.uni-kl.de makezero(); 122012027Sjungma@eit.uni-kl.de 122112027Sjungma@eit.uni-kl.de else { // other cases 122212027Sjungma@eit.uni-kl.de 122312027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 122412027Sjungma@eit.uni-kl.de 122512027Sjungma@eit.uni-kl.de and_on_help(sgn, nbits, ndigits, digit, 122612027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 122712027Sjungma@eit.uni-kl.de 122812027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 122912027Sjungma@eit.uni-kl.de 123012027Sjungma@eit.uni-kl.de } 123112027Sjungma@eit.uni-kl.de 123212027Sjungma@eit.uni-kl.de return *this; 123312027Sjungma@eit.uni-kl.de} 123412027Sjungma@eit.uni-kl.de 123512027Sjungma@eit.uni-kl.de 123612027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 123712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(long v) 123812027Sjungma@eit.uni-kl.de{ 123912027Sjungma@eit.uni-kl.de // u = *this 124012027Sjungma@eit.uni-kl.de 124112027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (v == 0)) // case 1 124212027Sjungma@eit.uni-kl.de makezero(); 124312027Sjungma@eit.uni-kl.de 124412027Sjungma@eit.uni-kl.de else { // other cases 124512027Sjungma@eit.uni-kl.de 124612027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 124712027Sjungma@eit.uni-kl.de 124812027Sjungma@eit.uni-kl.de and_on_help(sgn, nbits, ndigits, digit, 124912027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 125012027Sjungma@eit.uni-kl.de 125112027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 125212027Sjungma@eit.uni-kl.de 125312027Sjungma@eit.uni-kl.de } 125412027Sjungma@eit.uni-kl.de 125512027Sjungma@eit.uni-kl.de return *this; 125612027Sjungma@eit.uni-kl.de} 125712027Sjungma@eit.uni-kl.de 125812027Sjungma@eit.uni-kl.de 125912027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 126012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(unsigned long v) 126112027Sjungma@eit.uni-kl.de{ 126212027Sjungma@eit.uni-kl.de // u = *this 126312027Sjungma@eit.uni-kl.de 126412027Sjungma@eit.uni-kl.de if ((sgn == SC_ZERO) || (v == 0)) // case 1 126512027Sjungma@eit.uni-kl.de makezero(); 126612027Sjungma@eit.uni-kl.de 126712027Sjungma@eit.uni-kl.de else { // other cases 126812027Sjungma@eit.uni-kl.de 126912027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 127012027Sjungma@eit.uni-kl.de 127112027Sjungma@eit.uni-kl.de and_on_help(sgn, nbits, ndigits, digit, 127212027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 127312027Sjungma@eit.uni-kl.de 127412027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 127512027Sjungma@eit.uni-kl.de 127612027Sjungma@eit.uni-kl.de } 127712027Sjungma@eit.uni-kl.de 127812027Sjungma@eit.uni-kl.de return *this; 127912027Sjungma@eit.uni-kl.de} 128012027Sjungma@eit.uni-kl.de 128112027Sjungma@eit.uni-kl.de 128212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 128312027Sjungma@eit.uni-kl.de// SECTION: Bitwise OR operators: |, |= 128412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 128512027Sjungma@eit.uni-kl.de 128612027Sjungma@eit.uni-kl.de// Cases to consider when computing u | v: 128712027Sjungma@eit.uni-kl.de// 1. u | 0 = u 128812027Sjungma@eit.uni-kl.de// 2. 0 | v = v 128912027Sjungma@eit.uni-kl.de// 3. u | v => sgn = + 129012027Sjungma@eit.uni-kl.de// 4. (-u) | (-v) => sgn = - 129112027Sjungma@eit.uni-kl.de// 5. u | (-v) => sgn = - 129212027Sjungma@eit.uni-kl.de// 6. (-u) | v => sgn = - 129312027Sjungma@eit.uni-kl.de 129412027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 129512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(const CLASS_TYPE& v) 129612027Sjungma@eit.uni-kl.de{ 129712027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 1 129812027Sjungma@eit.uni-kl.de return *this; 129912027Sjungma@eit.uni-kl.de 130012027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 130112027Sjungma@eit.uni-kl.de return (*this = v); 130212027Sjungma@eit.uni-kl.de 130312027Sjungma@eit.uni-kl.de // other cases 130412027Sjungma@eit.uni-kl.de or_on_help(sgn, nbits, ndigits, digit, 130512027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 130612027Sjungma@eit.uni-kl.de 130712027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 130812027Sjungma@eit.uni-kl.de 130912027Sjungma@eit.uni-kl.de return *this; 131012027Sjungma@eit.uni-kl.de} 131112027Sjungma@eit.uni-kl.de 131212027Sjungma@eit.uni-kl.de 131312027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 131412027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(const OTHER_CLASS_TYPE& v) 131512027Sjungma@eit.uni-kl.de{ 131612027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 1 131712027Sjungma@eit.uni-kl.de return *this; 131812027Sjungma@eit.uni-kl.de 131912027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 132012027Sjungma@eit.uni-kl.de return (*this = v); 132112027Sjungma@eit.uni-kl.de 132212027Sjungma@eit.uni-kl.de // other cases 132312027Sjungma@eit.uni-kl.de or_on_help(sgn, nbits, ndigits, digit, 132412027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 132512027Sjungma@eit.uni-kl.de 132612027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 132712027Sjungma@eit.uni-kl.de 132812027Sjungma@eit.uni-kl.de return *this; 132912027Sjungma@eit.uni-kl.de} 133012027Sjungma@eit.uni-kl.de 133112027Sjungma@eit.uni-kl.de 133212027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 133312027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(int64 v) 133412027Sjungma@eit.uni-kl.de{ 133512027Sjungma@eit.uni-kl.de if (v == 0) // case 1 133612027Sjungma@eit.uni-kl.de return *this; 133712027Sjungma@eit.uni-kl.de 133812027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 133912027Sjungma@eit.uni-kl.de return (*this = v); 134012027Sjungma@eit.uni-kl.de 134112027Sjungma@eit.uni-kl.de // other cases 134212027Sjungma@eit.uni-kl.de 134312027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 134412027Sjungma@eit.uni-kl.de 134512027Sjungma@eit.uni-kl.de or_on_help(sgn, nbits, ndigits, digit, 134612027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 134712027Sjungma@eit.uni-kl.de 134812027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 134912027Sjungma@eit.uni-kl.de 135012027Sjungma@eit.uni-kl.de return *this; 135112027Sjungma@eit.uni-kl.de} 135212027Sjungma@eit.uni-kl.de 135312027Sjungma@eit.uni-kl.de 135412027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 135512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(uint64 v) 135612027Sjungma@eit.uni-kl.de{ 135712027Sjungma@eit.uni-kl.de if (v == 0) // case 1 135812027Sjungma@eit.uni-kl.de return *this; 135912027Sjungma@eit.uni-kl.de 136012027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 136112027Sjungma@eit.uni-kl.de return (*this = v); 136212027Sjungma@eit.uni-kl.de 136312027Sjungma@eit.uni-kl.de // other cases 136412027Sjungma@eit.uni-kl.de 136512027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 136612027Sjungma@eit.uni-kl.de 136712027Sjungma@eit.uni-kl.de or_on_help(sgn, nbits, ndigits, digit, 136812027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 136912027Sjungma@eit.uni-kl.de 137012027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 137112027Sjungma@eit.uni-kl.de 137212027Sjungma@eit.uni-kl.de return *this; 137312027Sjungma@eit.uni-kl.de} 137412027Sjungma@eit.uni-kl.de 137512027Sjungma@eit.uni-kl.de 137612027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 137712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(long v) 137812027Sjungma@eit.uni-kl.de{ 137912027Sjungma@eit.uni-kl.de if (v == 0) // case 1 138012027Sjungma@eit.uni-kl.de return *this; 138112027Sjungma@eit.uni-kl.de 138212027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 138312027Sjungma@eit.uni-kl.de return (*this = v); 138412027Sjungma@eit.uni-kl.de 138512027Sjungma@eit.uni-kl.de // other cases 138612027Sjungma@eit.uni-kl.de 138712027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 138812027Sjungma@eit.uni-kl.de 138912027Sjungma@eit.uni-kl.de or_on_help(sgn, nbits, ndigits, digit, 139012027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 139112027Sjungma@eit.uni-kl.de 139212027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 139312027Sjungma@eit.uni-kl.de 139412027Sjungma@eit.uni-kl.de return *this; 139512027Sjungma@eit.uni-kl.de} 139612027Sjungma@eit.uni-kl.de 139712027Sjungma@eit.uni-kl.de 139812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 139912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(unsigned long v) 140012027Sjungma@eit.uni-kl.de{ 140112027Sjungma@eit.uni-kl.de if (v == 0) // case 1 140212027Sjungma@eit.uni-kl.de return *this; 140312027Sjungma@eit.uni-kl.de 140412027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 140512027Sjungma@eit.uni-kl.de return (*this = v); 140612027Sjungma@eit.uni-kl.de 140712027Sjungma@eit.uni-kl.de // other cases 140812027Sjungma@eit.uni-kl.de 140912027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 141012027Sjungma@eit.uni-kl.de 141112027Sjungma@eit.uni-kl.de or_on_help(sgn, nbits, ndigits, digit, 141212027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 141312027Sjungma@eit.uni-kl.de 141412027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 141512027Sjungma@eit.uni-kl.de 141612027Sjungma@eit.uni-kl.de return *this; 141712027Sjungma@eit.uni-kl.de} 141812027Sjungma@eit.uni-kl.de 141912027Sjungma@eit.uni-kl.de 142012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 142112027Sjungma@eit.uni-kl.de// SECTION: Bitwise XOR operators: ^, ^= 142212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 142312027Sjungma@eit.uni-kl.de 142412027Sjungma@eit.uni-kl.de// Cases to consider when computing u ^ v: 142512027Sjungma@eit.uni-kl.de// Note that u ^ v = (~u & v) | (u & ~v). 142612027Sjungma@eit.uni-kl.de// 1. u ^ 0 = u 142712027Sjungma@eit.uni-kl.de// 2. 0 ^ v = v 142812027Sjungma@eit.uni-kl.de// 3. u ^ v => sgn = + 142912027Sjungma@eit.uni-kl.de// 4. (-u) ^ (-v) => sgn = - 143012027Sjungma@eit.uni-kl.de// 5. u ^ (-v) => sgn = - 143112027Sjungma@eit.uni-kl.de// 6. (-u) ^ v => sgn = + 143212027Sjungma@eit.uni-kl.de 143312027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 143412027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(const CLASS_TYPE& v) 143512027Sjungma@eit.uni-kl.de{ 143612027Sjungma@eit.uni-kl.de // u = *this 143712027Sjungma@eit.uni-kl.de 143812027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 1 143912027Sjungma@eit.uni-kl.de return *this; 144012027Sjungma@eit.uni-kl.de 144112027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 144212027Sjungma@eit.uni-kl.de return (*this = v); 144312027Sjungma@eit.uni-kl.de 144412027Sjungma@eit.uni-kl.de // other cases 144512027Sjungma@eit.uni-kl.de xor_on_help(sgn, nbits, ndigits, digit, 144612027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 144712027Sjungma@eit.uni-kl.de 144812027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 144912027Sjungma@eit.uni-kl.de 145012027Sjungma@eit.uni-kl.de return *this; 145112027Sjungma@eit.uni-kl.de} 145212027Sjungma@eit.uni-kl.de 145312027Sjungma@eit.uni-kl.de 145412027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 145512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(const OTHER_CLASS_TYPE& v) 145612027Sjungma@eit.uni-kl.de{ 145712027Sjungma@eit.uni-kl.de // u = *this 145812027Sjungma@eit.uni-kl.de 145912027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 1 146012027Sjungma@eit.uni-kl.de return *this; 146112027Sjungma@eit.uni-kl.de 146212027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 146312027Sjungma@eit.uni-kl.de return (*this = v); 146412027Sjungma@eit.uni-kl.de 146512027Sjungma@eit.uni-kl.de // other cases 146612027Sjungma@eit.uni-kl.de xor_on_help(sgn, nbits, ndigits, digit, 146712027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 146812027Sjungma@eit.uni-kl.de 146912027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 147012027Sjungma@eit.uni-kl.de 147112027Sjungma@eit.uni-kl.de return *this; 147212027Sjungma@eit.uni-kl.de} 147312027Sjungma@eit.uni-kl.de 147412027Sjungma@eit.uni-kl.de 147512027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 147612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(int64 v) 147712027Sjungma@eit.uni-kl.de{ 147812027Sjungma@eit.uni-kl.de if (v == 0) // case 1 147912027Sjungma@eit.uni-kl.de return *this; 148012027Sjungma@eit.uni-kl.de 148112027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 148212027Sjungma@eit.uni-kl.de return (*this = v); 148312027Sjungma@eit.uni-kl.de 148412027Sjungma@eit.uni-kl.de // other cases 148512027Sjungma@eit.uni-kl.de 148612027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 148712027Sjungma@eit.uni-kl.de 148812027Sjungma@eit.uni-kl.de xor_on_help(sgn, nbits, ndigits, digit, 148912027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 149012027Sjungma@eit.uni-kl.de 149112027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 149212027Sjungma@eit.uni-kl.de 149312027Sjungma@eit.uni-kl.de return *this; 149412027Sjungma@eit.uni-kl.de} 149512027Sjungma@eit.uni-kl.de 149612027Sjungma@eit.uni-kl.de 149712027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 149812027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(uint64 v) 149912027Sjungma@eit.uni-kl.de{ 150012027Sjungma@eit.uni-kl.de if (v == 0) // case 1 150112027Sjungma@eit.uni-kl.de return *this; 150212027Sjungma@eit.uni-kl.de 150312027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 150412027Sjungma@eit.uni-kl.de return (*this = v); 150512027Sjungma@eit.uni-kl.de 150612027Sjungma@eit.uni-kl.de // other cases 150712027Sjungma@eit.uni-kl.de 150812027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 150912027Sjungma@eit.uni-kl.de 151012027Sjungma@eit.uni-kl.de xor_on_help(sgn, nbits, ndigits, digit, 151112027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 151212027Sjungma@eit.uni-kl.de 151312027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 151412027Sjungma@eit.uni-kl.de 151512027Sjungma@eit.uni-kl.de return *this; 151612027Sjungma@eit.uni-kl.de} 151712027Sjungma@eit.uni-kl.de 151812027Sjungma@eit.uni-kl.de 151912027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 152012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(long v) 152112027Sjungma@eit.uni-kl.de{ 152212027Sjungma@eit.uni-kl.de if (v == 0) // case 1 152312027Sjungma@eit.uni-kl.de return *this; 152412027Sjungma@eit.uni-kl.de 152512027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 152612027Sjungma@eit.uni-kl.de return (*this = v); 152712027Sjungma@eit.uni-kl.de 152812027Sjungma@eit.uni-kl.de // other cases 152912027Sjungma@eit.uni-kl.de 153012027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 153112027Sjungma@eit.uni-kl.de 153212027Sjungma@eit.uni-kl.de xor_on_help(sgn, nbits, ndigits, digit, 153312027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 153412027Sjungma@eit.uni-kl.de 153512027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 153612027Sjungma@eit.uni-kl.de 153712027Sjungma@eit.uni-kl.de return *this; 153812027Sjungma@eit.uni-kl.de} 153912027Sjungma@eit.uni-kl.de 154012027Sjungma@eit.uni-kl.de 154112027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 154212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(unsigned long v) 154312027Sjungma@eit.uni-kl.de{ 154412027Sjungma@eit.uni-kl.de if (v == 0) // case 1 154512027Sjungma@eit.uni-kl.de return *this; 154612027Sjungma@eit.uni-kl.de 154712027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) // case 2 154812027Sjungma@eit.uni-kl.de return (*this = v); 154912027Sjungma@eit.uni-kl.de 155012027Sjungma@eit.uni-kl.de // other cases 155112027Sjungma@eit.uni-kl.de 155212027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 155312027Sjungma@eit.uni-kl.de 155412027Sjungma@eit.uni-kl.de xor_on_help(sgn, nbits, ndigits, digit, 155512027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 155612027Sjungma@eit.uni-kl.de 155712027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 155812027Sjungma@eit.uni-kl.de 155912027Sjungma@eit.uni-kl.de return *this; 156012027Sjungma@eit.uni-kl.de} 156112027Sjungma@eit.uni-kl.de 156212027Sjungma@eit.uni-kl.de 156312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 156412027Sjungma@eit.uni-kl.de// SECTION: Bitwise NOT operator: ~ 156512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 156612027Sjungma@eit.uni-kl.de 156712027Sjungma@eit.uni-kl.deCLASS_TYPE 156812027Sjungma@eit.uni-kl.deoperator~(const CLASS_TYPE& u) 156912027Sjungma@eit.uni-kl.de{ 157012027Sjungma@eit.uni-kl.de small_type s = u.sgn; 157112027Sjungma@eit.uni-kl.de 157212027Sjungma@eit.uni-kl.de if (s == SC_ZERO) { 157312027Sjungma@eit.uni-kl.de 157412027Sjungma@eit.uni-kl.de sc_digit d = 1; 157512027Sjungma@eit.uni-kl.de return CLASS_TYPE(SC_NEG, u.nbits, 1, &d, false); 157612027Sjungma@eit.uni-kl.de 157712027Sjungma@eit.uni-kl.de } 157812027Sjungma@eit.uni-kl.de 157912027Sjungma@eit.uni-kl.de int nd = u.ndigits; 158012027Sjungma@eit.uni-kl.de 158112027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 158212027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 158312027Sjungma@eit.uni-kl.de#else 158412027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[nd]; 158512027Sjungma@eit.uni-kl.de#endif 158612027Sjungma@eit.uni-kl.de 158712027Sjungma@eit.uni-kl.de vec_copy(nd, d, u.digit); 158812027Sjungma@eit.uni-kl.de 158912027Sjungma@eit.uni-kl.de if (s == SC_POS) { 159012027Sjungma@eit.uni-kl.de 159112027Sjungma@eit.uni-kl.de s = SC_NEG; 159212027Sjungma@eit.uni-kl.de vec_add_small_on(nd, d, 1); 159312027Sjungma@eit.uni-kl.de 159412027Sjungma@eit.uni-kl.de } 159512027Sjungma@eit.uni-kl.de else { 159612027Sjungma@eit.uni-kl.de 159712027Sjungma@eit.uni-kl.de s = SC_POS; 159812027Sjungma@eit.uni-kl.de vec_sub_small_on(nd, d, 1); 159912027Sjungma@eit.uni-kl.de 160012027Sjungma@eit.uni-kl.de if (check_for_zero(nd, d)) 160112027Sjungma@eit.uni-kl.de s = SC_ZERO; 160212027Sjungma@eit.uni-kl.de 160312027Sjungma@eit.uni-kl.de } 160412027Sjungma@eit.uni-kl.de 160512027Sjungma@eit.uni-kl.de return CLASS_TYPE(s, u.nbits, nd, d); 160612027Sjungma@eit.uni-kl.de} 160712027Sjungma@eit.uni-kl.de 160812027Sjungma@eit.uni-kl.de 160912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 161012027Sjungma@eit.uni-kl.de// SECTION: LEFT SHIFT operators: <<, <<= 161112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 161212027Sjungma@eit.uni-kl.de 161312027Sjungma@eit.uni-kl.deCLASS_TYPE 161412027Sjungma@eit.uni-kl.deoperator<<(const CLASS_TYPE& u, const CLASS_TYPE& v) 161512027Sjungma@eit.uni-kl.de{ 161612027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) 161712027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 161812027Sjungma@eit.uni-kl.de 161912027Sjungma@eit.uni-kl.de#ifdef SC_SIGNED 162012027Sjungma@eit.uni-kl.de if (v.sgn == SC_NEG) 162112027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 162212027Sjungma@eit.uni-kl.de#endif 162312027Sjungma@eit.uni-kl.de 162412027Sjungma@eit.uni-kl.de return operator<<(u, v.to_ulong()); 162512027Sjungma@eit.uni-kl.de} 162612027Sjungma@eit.uni-kl.de 162712027Sjungma@eit.uni-kl.de 162812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 162912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(const CLASS_TYPE& v) 163012027Sjungma@eit.uni-kl.de{ 163112027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) 163212027Sjungma@eit.uni-kl.de return *this; 163312027Sjungma@eit.uni-kl.de 163412027Sjungma@eit.uni-kl.de#ifdef SC_SIGNED 163512027Sjungma@eit.uni-kl.de if (v.sgn == SC_NEG) 163612027Sjungma@eit.uni-kl.de return *this; 163712027Sjungma@eit.uni-kl.de#endif 163812027Sjungma@eit.uni-kl.de 163912027Sjungma@eit.uni-kl.de return operator<<=(v.to_ulong()); 164012027Sjungma@eit.uni-kl.de} 164112027Sjungma@eit.uni-kl.de 164212027Sjungma@eit.uni-kl.de 164312027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 164412027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(const OTHER_CLASS_TYPE& v) 164512027Sjungma@eit.uni-kl.de{ 164612027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) 164712027Sjungma@eit.uni-kl.de return *this; 164812027Sjungma@eit.uni-kl.de 164912027Sjungma@eit.uni-kl.de#ifdef SC_UNSIGNED 165012027Sjungma@eit.uni-kl.de if (v.sgn == SC_NEG) 165112027Sjungma@eit.uni-kl.de return *this; 165212027Sjungma@eit.uni-kl.de#endif 165312027Sjungma@eit.uni-kl.de 165412027Sjungma@eit.uni-kl.de return operator<<=(v.to_ulong()); 165512027Sjungma@eit.uni-kl.de} 165612027Sjungma@eit.uni-kl.de 165712027Sjungma@eit.uni-kl.de 165812027Sjungma@eit.uni-kl.deCLASS_TYPE 165912027Sjungma@eit.uni-kl.deoperator<<(const CLASS_TYPE& u, int64 v) 166012027Sjungma@eit.uni-kl.de{ 166112027Sjungma@eit.uni-kl.de if (v <= 0) 166212027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 166312027Sjungma@eit.uni-kl.de 166412027Sjungma@eit.uni-kl.de return operator<<(u, (unsigned long) v); 166512027Sjungma@eit.uni-kl.de} 166612027Sjungma@eit.uni-kl.de 166712027Sjungma@eit.uni-kl.de 166812027Sjungma@eit.uni-kl.deCLASS_TYPE 166912027Sjungma@eit.uni-kl.deoperator<<(const CLASS_TYPE& u, uint64 v) 167012027Sjungma@eit.uni-kl.de{ 167112027Sjungma@eit.uni-kl.de if (v == 0) 167212027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 167312027Sjungma@eit.uni-kl.de 167412027Sjungma@eit.uni-kl.de return operator<<(u, (unsigned long) v); 167512027Sjungma@eit.uni-kl.de} 167612027Sjungma@eit.uni-kl.de 167712027Sjungma@eit.uni-kl.de 167812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 167912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(int64 v) 168012027Sjungma@eit.uni-kl.de{ 168112027Sjungma@eit.uni-kl.de if (v <= 0) 168212027Sjungma@eit.uni-kl.de return *this; 168312027Sjungma@eit.uni-kl.de 168412027Sjungma@eit.uni-kl.de return operator<<=((unsigned long) v); 168512027Sjungma@eit.uni-kl.de} 168612027Sjungma@eit.uni-kl.de 168712027Sjungma@eit.uni-kl.de 168812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 168912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(uint64 v) 169012027Sjungma@eit.uni-kl.de{ 169112027Sjungma@eit.uni-kl.de if (v == 0) 169212027Sjungma@eit.uni-kl.de return *this; 169312027Sjungma@eit.uni-kl.de 169412027Sjungma@eit.uni-kl.de return operator<<=((unsigned long) v); 169512027Sjungma@eit.uni-kl.de} 169612027Sjungma@eit.uni-kl.de 169712027Sjungma@eit.uni-kl.de 169812027Sjungma@eit.uni-kl.deCLASS_TYPE 169912027Sjungma@eit.uni-kl.deoperator<<(const CLASS_TYPE& u, long v) 170012027Sjungma@eit.uni-kl.de{ 170112027Sjungma@eit.uni-kl.de if (v <= 0) 170212027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 170312027Sjungma@eit.uni-kl.de 170412027Sjungma@eit.uni-kl.de return operator<<(u, (unsigned long) v); 170512027Sjungma@eit.uni-kl.de} 170612027Sjungma@eit.uni-kl.de 170712027Sjungma@eit.uni-kl.deCLASS_TYPE 170812027Sjungma@eit.uni-kl.deoperator<<(const CLASS_TYPE& u, unsigned long v) 170912027Sjungma@eit.uni-kl.de{ 171012027Sjungma@eit.uni-kl.de if (v == 0) 171112027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 171212027Sjungma@eit.uni-kl.de 171312027Sjungma@eit.uni-kl.de if (u.sgn == SC_ZERO) 171412027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 171512027Sjungma@eit.uni-kl.de 171612027Sjungma@eit.uni-kl.de int nb = u.nbits + v; 171712027Sjungma@eit.uni-kl.de int nd = DIV_CEIL(nb); 171812027Sjungma@eit.uni-kl.de 171912027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 172012027Sjungma@eit.uni-kl.de test_bound(nb); 172112027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 172212027Sjungma@eit.uni-kl.de#else 172312027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[nd]; 172412027Sjungma@eit.uni-kl.de#endif 172512027Sjungma@eit.uni-kl.de 172612027Sjungma@eit.uni-kl.de vec_copy_and_zero(nd, d, u.ndigits, u.digit); 172712027Sjungma@eit.uni-kl.de 172812027Sjungma@eit.uni-kl.de convert_SM_to_2C(u.sgn, nd, d); 172912027Sjungma@eit.uni-kl.de 173012027Sjungma@eit.uni-kl.de vec_shift_left(nd, d, v); 173112027Sjungma@eit.uni-kl.de 173212027Sjungma@eit.uni-kl.de small_type s = convert_signed_2C_to_SM(nb, nd, d); 173312027Sjungma@eit.uni-kl.de 173412027Sjungma@eit.uni-kl.de return CLASS_TYPE(s, nb, nd, d); 173512027Sjungma@eit.uni-kl.de} 173612027Sjungma@eit.uni-kl.de 173712027Sjungma@eit.uni-kl.de 173812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 173912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(long v) 174012027Sjungma@eit.uni-kl.de{ 174112027Sjungma@eit.uni-kl.de if (v <= 0) 174212027Sjungma@eit.uni-kl.de return *this; 174312027Sjungma@eit.uni-kl.de 174412027Sjungma@eit.uni-kl.de return operator<<=((unsigned long) v); 174512027Sjungma@eit.uni-kl.de} 174612027Sjungma@eit.uni-kl.de 174712027Sjungma@eit.uni-kl.de 174812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 174912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(unsigned long v) 175012027Sjungma@eit.uni-kl.de{ 175112027Sjungma@eit.uni-kl.de if (v == 0) 175212027Sjungma@eit.uni-kl.de return *this; 175312027Sjungma@eit.uni-kl.de 175412027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) 175512027Sjungma@eit.uni-kl.de return *this; 175612027Sjungma@eit.uni-kl.de 175712027Sjungma@eit.uni-kl.de convert_SM_to_2C(); 175812027Sjungma@eit.uni-kl.de 175912027Sjungma@eit.uni-kl.de vec_shift_left(ndigits, digit, v); 176012027Sjungma@eit.uni-kl.de 176112027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 176212027Sjungma@eit.uni-kl.de 176312027Sjungma@eit.uni-kl.de return *this; 176412027Sjungma@eit.uni-kl.de} 176512027Sjungma@eit.uni-kl.de 176612027Sjungma@eit.uni-kl.de 176712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 176812027Sjungma@eit.uni-kl.de// SECTION: RIGHT SHIFT operators: >>, >>= 176912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 177012027Sjungma@eit.uni-kl.de 177112027Sjungma@eit.uni-kl.deCLASS_TYPE 177212027Sjungma@eit.uni-kl.deoperator>>(const CLASS_TYPE& u, const CLASS_TYPE& v) 177312027Sjungma@eit.uni-kl.de{ 177412027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) 177512027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 177612027Sjungma@eit.uni-kl.de 177712027Sjungma@eit.uni-kl.de#ifdef SC_SIGNED 177812027Sjungma@eit.uni-kl.de if (v.sgn == SC_NEG) 177912027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 178012027Sjungma@eit.uni-kl.de#endif 178112027Sjungma@eit.uni-kl.de 178212027Sjungma@eit.uni-kl.de return operator>>(u, v.to_long()); 178312027Sjungma@eit.uni-kl.de} 178412027Sjungma@eit.uni-kl.de 178512027Sjungma@eit.uni-kl.de 178612027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 178712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(const CLASS_TYPE& v) 178812027Sjungma@eit.uni-kl.de{ 178912027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) 179012027Sjungma@eit.uni-kl.de return *this; 179112027Sjungma@eit.uni-kl.de 179212027Sjungma@eit.uni-kl.de#ifdef SC_SIGNED 179312027Sjungma@eit.uni-kl.de if (v.sgn == SC_NEG) 179412027Sjungma@eit.uni-kl.de return *this; 179512027Sjungma@eit.uni-kl.de#endif 179612027Sjungma@eit.uni-kl.de 179712027Sjungma@eit.uni-kl.de return operator>>=(v.to_long()); 179812027Sjungma@eit.uni-kl.de} 179912027Sjungma@eit.uni-kl.de 180012027Sjungma@eit.uni-kl.de 180112027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 180212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(const OTHER_CLASS_TYPE& v) 180312027Sjungma@eit.uni-kl.de{ 180412027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) 180512027Sjungma@eit.uni-kl.de return *this; 180612027Sjungma@eit.uni-kl.de 180712027Sjungma@eit.uni-kl.de#ifdef SC_UNSIGNED 180812027Sjungma@eit.uni-kl.de if (v.sgn == SC_NEG) 180912027Sjungma@eit.uni-kl.de return *this; 181012027Sjungma@eit.uni-kl.de#endif 181112027Sjungma@eit.uni-kl.de 181212027Sjungma@eit.uni-kl.de return operator>>=(v.to_ulong()); 181312027Sjungma@eit.uni-kl.de} 181412027Sjungma@eit.uni-kl.de 181512027Sjungma@eit.uni-kl.de 181612027Sjungma@eit.uni-kl.deCLASS_TYPE 181712027Sjungma@eit.uni-kl.deoperator>>(const CLASS_TYPE& u, int64 v) 181812027Sjungma@eit.uni-kl.de{ 181912027Sjungma@eit.uni-kl.de if (v <= 0) 182012027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 182112027Sjungma@eit.uni-kl.de 182212027Sjungma@eit.uni-kl.de return operator>>(u, (unsigned long) v); 182312027Sjungma@eit.uni-kl.de} 182412027Sjungma@eit.uni-kl.de 182512027Sjungma@eit.uni-kl.de 182612027Sjungma@eit.uni-kl.deCLASS_TYPE 182712027Sjungma@eit.uni-kl.deoperator>>(const CLASS_TYPE& u, uint64 v) 182812027Sjungma@eit.uni-kl.de{ 182912027Sjungma@eit.uni-kl.de if (v == 0) 183012027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 183112027Sjungma@eit.uni-kl.de 183212027Sjungma@eit.uni-kl.de return operator>>(u, (unsigned long) v); 183312027Sjungma@eit.uni-kl.de} 183412027Sjungma@eit.uni-kl.de 183512027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 183612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(int64 v) 183712027Sjungma@eit.uni-kl.de{ 183812027Sjungma@eit.uni-kl.de if (v <= 0) 183912027Sjungma@eit.uni-kl.de return *this; 184012027Sjungma@eit.uni-kl.de 184112027Sjungma@eit.uni-kl.de return operator>>=((unsigned long) v); 184212027Sjungma@eit.uni-kl.de} 184312027Sjungma@eit.uni-kl.de 184412027Sjungma@eit.uni-kl.de 184512027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 184612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(uint64 v) 184712027Sjungma@eit.uni-kl.de{ 184812027Sjungma@eit.uni-kl.de if (v == 0) 184912027Sjungma@eit.uni-kl.de return *this; 185012027Sjungma@eit.uni-kl.de 185112027Sjungma@eit.uni-kl.de return operator>>=((unsigned long) v); 185212027Sjungma@eit.uni-kl.de} 185312027Sjungma@eit.uni-kl.de 185412027Sjungma@eit.uni-kl.de 185512027Sjungma@eit.uni-kl.deCLASS_TYPE 185612027Sjungma@eit.uni-kl.deoperator>>(const CLASS_TYPE& u, long v) 185712027Sjungma@eit.uni-kl.de{ 185812027Sjungma@eit.uni-kl.de if (v <= 0) 185912027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 186012027Sjungma@eit.uni-kl.de 186112027Sjungma@eit.uni-kl.de return operator>>(u, (unsigned long) v); 186212027Sjungma@eit.uni-kl.de} 186312027Sjungma@eit.uni-kl.de 186412027Sjungma@eit.uni-kl.de 186512027Sjungma@eit.uni-kl.deCLASS_TYPE 186612027Sjungma@eit.uni-kl.deoperator>>(const CLASS_TYPE& u, unsigned long v) 186712027Sjungma@eit.uni-kl.de{ 186812027Sjungma@eit.uni-kl.de if (v == 0) 186912027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 187012027Sjungma@eit.uni-kl.de 187112027Sjungma@eit.uni-kl.de if (u.sgn == SC_ZERO) 187212027Sjungma@eit.uni-kl.de return CLASS_TYPE(u); 187312027Sjungma@eit.uni-kl.de 187412027Sjungma@eit.uni-kl.de int nb = u.nbits; 187512027Sjungma@eit.uni-kl.de int nd = u.ndigits; 187612027Sjungma@eit.uni-kl.de 187712027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 187812027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 187912027Sjungma@eit.uni-kl.de#else 188012027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[nd]; 188112027Sjungma@eit.uni-kl.de#endif 188212027Sjungma@eit.uni-kl.de 188312027Sjungma@eit.uni-kl.de vec_copy(nd, d, u.digit); 188412027Sjungma@eit.uni-kl.de 188512027Sjungma@eit.uni-kl.de convert_SM_to_2C(u.sgn, nd, d); 188612027Sjungma@eit.uni-kl.de 188712027Sjungma@eit.uni-kl.de if (u.sgn == SC_NEG) 188812027Sjungma@eit.uni-kl.de vec_shift_right(nd, d, v, DIGIT_MASK); 188912027Sjungma@eit.uni-kl.de else 189012027Sjungma@eit.uni-kl.de vec_shift_right(nd, d, v, 0); 189112027Sjungma@eit.uni-kl.de 189212027Sjungma@eit.uni-kl.de small_type s = convert_signed_2C_to_SM(nb, nd, d); 189312027Sjungma@eit.uni-kl.de 189412027Sjungma@eit.uni-kl.de return CLASS_TYPE(s, nb, nd, d); 189512027Sjungma@eit.uni-kl.de} 189612027Sjungma@eit.uni-kl.de 189712027Sjungma@eit.uni-kl.de 189812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 189912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(long v) 190012027Sjungma@eit.uni-kl.de{ 190112027Sjungma@eit.uni-kl.de if (v <= 0) 190212027Sjungma@eit.uni-kl.de return *this; 190312027Sjungma@eit.uni-kl.de 190412027Sjungma@eit.uni-kl.de return operator>>=((unsigned long) v); 190512027Sjungma@eit.uni-kl.de} 190612027Sjungma@eit.uni-kl.de 190712027Sjungma@eit.uni-kl.de 190812027Sjungma@eit.uni-kl.deconst CLASS_TYPE& 190912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(unsigned long v) 191012027Sjungma@eit.uni-kl.de{ 191112027Sjungma@eit.uni-kl.de if (v == 0) 191212027Sjungma@eit.uni-kl.de return *this; 191312027Sjungma@eit.uni-kl.de 191412027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) 191512027Sjungma@eit.uni-kl.de return *this; 191612027Sjungma@eit.uni-kl.de 191712027Sjungma@eit.uni-kl.de convert_SM_to_2C(); 191812027Sjungma@eit.uni-kl.de 191912027Sjungma@eit.uni-kl.de if (sgn == SC_NEG) 192012027Sjungma@eit.uni-kl.de vec_shift_right(ndigits, digit, v, DIGIT_MASK); 192112027Sjungma@eit.uni-kl.de else 192212027Sjungma@eit.uni-kl.de vec_shift_right(ndigits, digit, v, 0); 192312027Sjungma@eit.uni-kl.de 192412027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 192512027Sjungma@eit.uni-kl.de 192612027Sjungma@eit.uni-kl.de return *this; 192712027Sjungma@eit.uni-kl.de} 192812027Sjungma@eit.uni-kl.de 192912027Sjungma@eit.uni-kl.de 193012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 193112027Sjungma@eit.uni-kl.de// SECTION: EQUAL TO operator: == 193212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 193312027Sjungma@eit.uni-kl.de 193412027Sjungma@eit.uni-kl.de// Defined in the sc_signed.cpp and sc_unsigned.cpp. 193512027Sjungma@eit.uni-kl.de 193612027Sjungma@eit.uni-kl.de 193712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 193812027Sjungma@eit.uni-kl.de// SECTION: NOT_EQUAL operator: != 193912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 194012027Sjungma@eit.uni-kl.de 194112027Sjungma@eit.uni-kl.debool 194212027Sjungma@eit.uni-kl.deoperator!=(const CLASS_TYPE& u, const CLASS_TYPE& v) 194312027Sjungma@eit.uni-kl.de{ 194412027Sjungma@eit.uni-kl.de return (! operator==(u, v)); 194512027Sjungma@eit.uni-kl.de} 194612027Sjungma@eit.uni-kl.de 194712027Sjungma@eit.uni-kl.de 194812027Sjungma@eit.uni-kl.debool 194912027Sjungma@eit.uni-kl.deoperator!=(const CLASS_TYPE& u, int64 v) 195012027Sjungma@eit.uni-kl.de{ 195112027Sjungma@eit.uni-kl.de return (! operator==(u, v)); 195212027Sjungma@eit.uni-kl.de} 195312027Sjungma@eit.uni-kl.de 195412027Sjungma@eit.uni-kl.de 195512027Sjungma@eit.uni-kl.debool 195612027Sjungma@eit.uni-kl.deoperator!=(int64 u, const CLASS_TYPE& v) 195712027Sjungma@eit.uni-kl.de{ 195812027Sjungma@eit.uni-kl.de return (! operator==(u, v)); 195912027Sjungma@eit.uni-kl.de} 196012027Sjungma@eit.uni-kl.de 196112027Sjungma@eit.uni-kl.de 196212027Sjungma@eit.uni-kl.debool 196312027Sjungma@eit.uni-kl.deoperator!=(const CLASS_TYPE& u, uint64 v) 196412027Sjungma@eit.uni-kl.de{ 196512027Sjungma@eit.uni-kl.de return (! operator==(u, v)); 196612027Sjungma@eit.uni-kl.de} 196712027Sjungma@eit.uni-kl.de 196812027Sjungma@eit.uni-kl.de 196912027Sjungma@eit.uni-kl.debool 197012027Sjungma@eit.uni-kl.deoperator!=(uint64 u, const CLASS_TYPE& v) 197112027Sjungma@eit.uni-kl.de{ 197212027Sjungma@eit.uni-kl.de return (! operator==(u, v)); 197312027Sjungma@eit.uni-kl.de} 197412027Sjungma@eit.uni-kl.de 197512027Sjungma@eit.uni-kl.de 197612027Sjungma@eit.uni-kl.debool 197712027Sjungma@eit.uni-kl.deoperator!=(const CLASS_TYPE& u, long v) 197812027Sjungma@eit.uni-kl.de{ 197912027Sjungma@eit.uni-kl.de return (! operator==(u, v)); 198012027Sjungma@eit.uni-kl.de} 198112027Sjungma@eit.uni-kl.de 198212027Sjungma@eit.uni-kl.de 198312027Sjungma@eit.uni-kl.debool 198412027Sjungma@eit.uni-kl.deoperator!=(long u, const CLASS_TYPE& v) 198512027Sjungma@eit.uni-kl.de{ 198612027Sjungma@eit.uni-kl.de return (! operator==(u, v)); 198712027Sjungma@eit.uni-kl.de} 198812027Sjungma@eit.uni-kl.de 198912027Sjungma@eit.uni-kl.de 199012027Sjungma@eit.uni-kl.debool 199112027Sjungma@eit.uni-kl.deoperator!=(const CLASS_TYPE& u, unsigned long v) 199212027Sjungma@eit.uni-kl.de{ 199312027Sjungma@eit.uni-kl.de return (! operator==(u, v)); 199412027Sjungma@eit.uni-kl.de} 199512027Sjungma@eit.uni-kl.de 199612027Sjungma@eit.uni-kl.de 199712027Sjungma@eit.uni-kl.debool 199812027Sjungma@eit.uni-kl.deoperator!=(unsigned long u, const CLASS_TYPE& v) 199912027Sjungma@eit.uni-kl.de{ 200012027Sjungma@eit.uni-kl.de return (! operator==(u, v)); 200112027Sjungma@eit.uni-kl.de} 200212027Sjungma@eit.uni-kl.de 200312027Sjungma@eit.uni-kl.de 200412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 200512027Sjungma@eit.uni-kl.de// SECTION: LESS THAN operator: < 200612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 200712027Sjungma@eit.uni-kl.de 200812027Sjungma@eit.uni-kl.de// Defined in the sc_signed.cpp and sc_unsigned.cpp. 200912027Sjungma@eit.uni-kl.de 201012027Sjungma@eit.uni-kl.de 201112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 201212027Sjungma@eit.uni-kl.de// SECTION: LESS THAN or EQUAL operator: <= 201312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 201412027Sjungma@eit.uni-kl.de 201512027Sjungma@eit.uni-kl.debool 201612027Sjungma@eit.uni-kl.deoperator<=(const CLASS_TYPE& u, const CLASS_TYPE& v) 201712027Sjungma@eit.uni-kl.de{ 201812027Sjungma@eit.uni-kl.de return (operator<(u, v) || operator==(u, v)); 201912027Sjungma@eit.uni-kl.de} 202012027Sjungma@eit.uni-kl.de 202112027Sjungma@eit.uni-kl.de 202212027Sjungma@eit.uni-kl.debool 202312027Sjungma@eit.uni-kl.deoperator<=(const CLASS_TYPE& u, int64 v) 202412027Sjungma@eit.uni-kl.de{ 202512027Sjungma@eit.uni-kl.de return (operator<(u, v) || operator==(u, v)); 202612027Sjungma@eit.uni-kl.de} 202712027Sjungma@eit.uni-kl.de 202812027Sjungma@eit.uni-kl.de 202912027Sjungma@eit.uni-kl.debool 203012027Sjungma@eit.uni-kl.deoperator<=(int64 u, const CLASS_TYPE& v) 203112027Sjungma@eit.uni-kl.de{ 203212027Sjungma@eit.uni-kl.de return (operator<(u, v) || operator==(u, v)); 203312027Sjungma@eit.uni-kl.de} 203412027Sjungma@eit.uni-kl.de 203512027Sjungma@eit.uni-kl.de 203612027Sjungma@eit.uni-kl.debool 203712027Sjungma@eit.uni-kl.deoperator<=(const CLASS_TYPE& u, uint64 v) 203812027Sjungma@eit.uni-kl.de{ 203912027Sjungma@eit.uni-kl.de return (operator<(u, v) || operator==(u, v)); 204012027Sjungma@eit.uni-kl.de} 204112027Sjungma@eit.uni-kl.de 204212027Sjungma@eit.uni-kl.de 204312027Sjungma@eit.uni-kl.debool 204412027Sjungma@eit.uni-kl.deoperator<=(uint64 u, const CLASS_TYPE& v) 204512027Sjungma@eit.uni-kl.de{ 204612027Sjungma@eit.uni-kl.de return (operator<(u, v) || operator==(u, v)); 204712027Sjungma@eit.uni-kl.de} 204812027Sjungma@eit.uni-kl.de 204912027Sjungma@eit.uni-kl.de 205012027Sjungma@eit.uni-kl.debool 205112027Sjungma@eit.uni-kl.deoperator<=(const CLASS_TYPE& u, long v) 205212027Sjungma@eit.uni-kl.de{ 205312027Sjungma@eit.uni-kl.de return (operator<(u, v) || operator==(u, v)); 205412027Sjungma@eit.uni-kl.de} 205512027Sjungma@eit.uni-kl.de 205612027Sjungma@eit.uni-kl.de 205712027Sjungma@eit.uni-kl.debool 205812027Sjungma@eit.uni-kl.deoperator<=(long u, const CLASS_TYPE& v) 205912027Sjungma@eit.uni-kl.de{ 206012027Sjungma@eit.uni-kl.de return (operator<(u, v) || operator==(u, v)); 206112027Sjungma@eit.uni-kl.de} 206212027Sjungma@eit.uni-kl.de 206312027Sjungma@eit.uni-kl.de 206412027Sjungma@eit.uni-kl.debool 206512027Sjungma@eit.uni-kl.deoperator<=(const CLASS_TYPE& u, unsigned long v) 206612027Sjungma@eit.uni-kl.de{ 206712027Sjungma@eit.uni-kl.de return (operator<(u, v) || operator==(u, v)); 206812027Sjungma@eit.uni-kl.de} 206912027Sjungma@eit.uni-kl.de 207012027Sjungma@eit.uni-kl.de 207112027Sjungma@eit.uni-kl.debool 207212027Sjungma@eit.uni-kl.deoperator<=(unsigned long u, const CLASS_TYPE& v) 207312027Sjungma@eit.uni-kl.de{ 207412027Sjungma@eit.uni-kl.de return (operator<(u, v) || operator==(u, v)); 207512027Sjungma@eit.uni-kl.de} 207612027Sjungma@eit.uni-kl.de 207712027Sjungma@eit.uni-kl.de 207812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 207912027Sjungma@eit.uni-kl.de// SECTION: GREATER THAN operator: > 208012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 208112027Sjungma@eit.uni-kl.de 208212027Sjungma@eit.uni-kl.debool 208312027Sjungma@eit.uni-kl.deoperator>(const CLASS_TYPE& u, const CLASS_TYPE& v) 208412027Sjungma@eit.uni-kl.de{ 208512027Sjungma@eit.uni-kl.de return (! (operator<=(u, v))); 208612027Sjungma@eit.uni-kl.de} 208712027Sjungma@eit.uni-kl.de 208812027Sjungma@eit.uni-kl.de 208912027Sjungma@eit.uni-kl.debool 209012027Sjungma@eit.uni-kl.deoperator>(const CLASS_TYPE& u, int64 v) 209112027Sjungma@eit.uni-kl.de{ 209212027Sjungma@eit.uni-kl.de return (! (operator<=(u, v))); 209312027Sjungma@eit.uni-kl.de} 209412027Sjungma@eit.uni-kl.de 209512027Sjungma@eit.uni-kl.de 209612027Sjungma@eit.uni-kl.debool 209712027Sjungma@eit.uni-kl.deoperator>(int64 u, const CLASS_TYPE& v) 209812027Sjungma@eit.uni-kl.de{ 209912027Sjungma@eit.uni-kl.de return (! (operator<=(u, v))); 210012027Sjungma@eit.uni-kl.de} 210112027Sjungma@eit.uni-kl.de 210212027Sjungma@eit.uni-kl.de 210312027Sjungma@eit.uni-kl.debool 210412027Sjungma@eit.uni-kl.deoperator>(const CLASS_TYPE& u, uint64 v) 210512027Sjungma@eit.uni-kl.de{ 210612027Sjungma@eit.uni-kl.de return (! (operator<=(u, v))); 210712027Sjungma@eit.uni-kl.de} 210812027Sjungma@eit.uni-kl.de 210912027Sjungma@eit.uni-kl.de 211012027Sjungma@eit.uni-kl.debool 211112027Sjungma@eit.uni-kl.deoperator>(uint64 u, const CLASS_TYPE& v) 211212027Sjungma@eit.uni-kl.de{ 211312027Sjungma@eit.uni-kl.de return (! (operator<=(u, v))); 211412027Sjungma@eit.uni-kl.de} 211512027Sjungma@eit.uni-kl.de 211612027Sjungma@eit.uni-kl.de 211712027Sjungma@eit.uni-kl.debool 211812027Sjungma@eit.uni-kl.deoperator>(const CLASS_TYPE& u, long v) 211912027Sjungma@eit.uni-kl.de{ 212012027Sjungma@eit.uni-kl.de return (! (operator<=(u, v))); 212112027Sjungma@eit.uni-kl.de} 212212027Sjungma@eit.uni-kl.de 212312027Sjungma@eit.uni-kl.de 212412027Sjungma@eit.uni-kl.debool 212512027Sjungma@eit.uni-kl.deoperator>(long u, const CLASS_TYPE& v) 212612027Sjungma@eit.uni-kl.de{ 212712027Sjungma@eit.uni-kl.de return (! (operator<=(u, v))); 212812027Sjungma@eit.uni-kl.de} 212912027Sjungma@eit.uni-kl.de 213012027Sjungma@eit.uni-kl.de 213112027Sjungma@eit.uni-kl.debool 213212027Sjungma@eit.uni-kl.deoperator>(const CLASS_TYPE& u, unsigned long v) 213312027Sjungma@eit.uni-kl.de{ 213412027Sjungma@eit.uni-kl.de return (! (operator<=(u, v))); 213512027Sjungma@eit.uni-kl.de} 213612027Sjungma@eit.uni-kl.de 213712027Sjungma@eit.uni-kl.de 213812027Sjungma@eit.uni-kl.debool 213912027Sjungma@eit.uni-kl.deoperator>(unsigned long u, const CLASS_TYPE& v) 214012027Sjungma@eit.uni-kl.de{ 214112027Sjungma@eit.uni-kl.de return (! (operator<=(u, v))); 214212027Sjungma@eit.uni-kl.de} 214312027Sjungma@eit.uni-kl.de 214412027Sjungma@eit.uni-kl.de 214512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 214612027Sjungma@eit.uni-kl.de// SECTION: GREATER THAN or EQUAL operator: >= 214712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 214812027Sjungma@eit.uni-kl.de 214912027Sjungma@eit.uni-kl.debool 215012027Sjungma@eit.uni-kl.deoperator>=(const CLASS_TYPE& u, const CLASS_TYPE& v) 215112027Sjungma@eit.uni-kl.de{ 215212027Sjungma@eit.uni-kl.de return (! (operator<(u, v))); 215312027Sjungma@eit.uni-kl.de} 215412027Sjungma@eit.uni-kl.de 215512027Sjungma@eit.uni-kl.de 215612027Sjungma@eit.uni-kl.debool 215712027Sjungma@eit.uni-kl.deoperator>=(const CLASS_TYPE& u, int64 v) 215812027Sjungma@eit.uni-kl.de{ 215912027Sjungma@eit.uni-kl.de return (! (operator<(u, v))); 216012027Sjungma@eit.uni-kl.de} 216112027Sjungma@eit.uni-kl.de 216212027Sjungma@eit.uni-kl.de 216312027Sjungma@eit.uni-kl.debool 216412027Sjungma@eit.uni-kl.deoperator>=(int64 u, const CLASS_TYPE& v) 216512027Sjungma@eit.uni-kl.de{ 216612027Sjungma@eit.uni-kl.de return (! (operator<(u, v))); 216712027Sjungma@eit.uni-kl.de} 216812027Sjungma@eit.uni-kl.de 216912027Sjungma@eit.uni-kl.de 217012027Sjungma@eit.uni-kl.debool 217112027Sjungma@eit.uni-kl.deoperator>=(const CLASS_TYPE& u, uint64 v) 217212027Sjungma@eit.uni-kl.de{ 217312027Sjungma@eit.uni-kl.de return (! (operator<(u, v))); 217412027Sjungma@eit.uni-kl.de} 217512027Sjungma@eit.uni-kl.de 217612027Sjungma@eit.uni-kl.de 217712027Sjungma@eit.uni-kl.debool 217812027Sjungma@eit.uni-kl.deoperator>=(uint64 u, const CLASS_TYPE& v) 217912027Sjungma@eit.uni-kl.de{ 218012027Sjungma@eit.uni-kl.de return (! (operator<(u, v))); 218112027Sjungma@eit.uni-kl.de} 218212027Sjungma@eit.uni-kl.de 218312027Sjungma@eit.uni-kl.de 218412027Sjungma@eit.uni-kl.debool 218512027Sjungma@eit.uni-kl.deoperator>=(const CLASS_TYPE& u, long v) 218612027Sjungma@eit.uni-kl.de{ 218712027Sjungma@eit.uni-kl.de return (! (operator<(u, v))); 218812027Sjungma@eit.uni-kl.de} 218912027Sjungma@eit.uni-kl.de 219012027Sjungma@eit.uni-kl.de 219112027Sjungma@eit.uni-kl.debool 219212027Sjungma@eit.uni-kl.deoperator>=(long u, const CLASS_TYPE& v) 219312027Sjungma@eit.uni-kl.de{ 219412027Sjungma@eit.uni-kl.de return (! (operator<(u, v))); 219512027Sjungma@eit.uni-kl.de} 219612027Sjungma@eit.uni-kl.de 219712027Sjungma@eit.uni-kl.de 219812027Sjungma@eit.uni-kl.debool 219912027Sjungma@eit.uni-kl.deoperator>=(const CLASS_TYPE& u, unsigned long v) 220012027Sjungma@eit.uni-kl.de{ 220112027Sjungma@eit.uni-kl.de return (! (operator<(u, v))); 220212027Sjungma@eit.uni-kl.de} 220312027Sjungma@eit.uni-kl.de 220412027Sjungma@eit.uni-kl.de 220512027Sjungma@eit.uni-kl.debool 220612027Sjungma@eit.uni-kl.deoperator>=(unsigned long u, const CLASS_TYPE& v) 220712027Sjungma@eit.uni-kl.de{ 220812027Sjungma@eit.uni-kl.de return (! (operator<(u, v))); 220912027Sjungma@eit.uni-kl.de} 221012027Sjungma@eit.uni-kl.de 221112027Sjungma@eit.uni-kl.de 221212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 221312027Sjungma@eit.uni-kl.de// SECTION: Public members - Other utils. 221412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 221512027Sjungma@eit.uni-kl.de 221612027Sjungma@eit.uni-kl.de// Convert to int64, long, or int. 221712027Sjungma@eit.uni-kl.de#define TO_INTX(RET_TYPE, UP_RET_TYPE) \ 221812027Sjungma@eit.uni-kl.de \ 221912027Sjungma@eit.uni-kl.deif (sgn == SC_ZERO) \ 222012027Sjungma@eit.uni-kl.dereturn 0; \ 222112027Sjungma@eit.uni-kl.de \ 222212027Sjungma@eit.uni-kl.deint vnd = sc_min((int)DIGITS_PER_ ## UP_RET_TYPE, ndigits); \ 222312027Sjungma@eit.uni-kl.de \ 222412027Sjungma@eit.uni-kl.deRET_TYPE v = 0; \ 222512027Sjungma@eit.uni-kl.dewhile (--vnd >= 0) \ 222612027Sjungma@eit.uni-kl.dev = (v << BITS_PER_DIGIT) + digit[vnd]; \ 222712027Sjungma@eit.uni-kl.de \ 222812027Sjungma@eit.uni-kl.deif (sgn == SC_NEG) \ 222912027Sjungma@eit.uni-kl.dereturn -v; \ 223012027Sjungma@eit.uni-kl.deelse \ 223112027Sjungma@eit.uni-kl.dereturn v; 223212027Sjungma@eit.uni-kl.de 223312027Sjungma@eit.uni-kl.de 223412027Sjungma@eit.uni-kl.deint64 223512027Sjungma@eit.uni-kl.deCLASS_TYPE::to_int64() const 223612027Sjungma@eit.uni-kl.de{ 223712027Sjungma@eit.uni-kl.de TO_INTX(int64, INT64); 223812027Sjungma@eit.uni-kl.de} 223912027Sjungma@eit.uni-kl.de 224012027Sjungma@eit.uni-kl.de 224112027Sjungma@eit.uni-kl.delong 224212027Sjungma@eit.uni-kl.deCLASS_TYPE::to_long() const 224312027Sjungma@eit.uni-kl.de{ 224412027Sjungma@eit.uni-kl.de TO_INTX(long, LONG); 224512027Sjungma@eit.uni-kl.de} 224612027Sjungma@eit.uni-kl.de 224712027Sjungma@eit.uni-kl.de 224812027Sjungma@eit.uni-kl.deint 224912027Sjungma@eit.uni-kl.deCLASS_TYPE::to_int() const 225012027Sjungma@eit.uni-kl.de{ 225112027Sjungma@eit.uni-kl.de TO_INTX(int, INT); 225212027Sjungma@eit.uni-kl.de} 225312027Sjungma@eit.uni-kl.de 225412027Sjungma@eit.uni-kl.de 225512027Sjungma@eit.uni-kl.de// Convert to unsigned int64, unsigned long or unsigned 225612027Sjungma@eit.uni-kl.de// int. to_uint64, to_ulong, and to_uint have the same body except for 225712027Sjungma@eit.uni-kl.de// the type of v defined inside. 225812027Sjungma@eit.uni-kl.deuint64 225912027Sjungma@eit.uni-kl.deCLASS_TYPE::to_uint64() const 226012027Sjungma@eit.uni-kl.de{ 226112027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) 226212027Sjungma@eit.uni-kl.de return 0; 226312027Sjungma@eit.uni-kl.de 226412027Sjungma@eit.uni-kl.de int vnd = sc_min((int)DIGITS_PER_INT64, ndigits); 226512027Sjungma@eit.uni-kl.de 226612027Sjungma@eit.uni-kl.de uint64 v = 0; 226712027Sjungma@eit.uni-kl.de 226812027Sjungma@eit.uni-kl.de if (sgn == SC_NEG) { 226912027Sjungma@eit.uni-kl.de 227012027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 227112027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 227212027Sjungma@eit.uni-kl.de#else 227312027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[ndigits]; 227412027Sjungma@eit.uni-kl.de#endif 227512027Sjungma@eit.uni-kl.de 227612027Sjungma@eit.uni-kl.de vec_copy(ndigits, d, digit); 227712027Sjungma@eit.uni-kl.de 227812027Sjungma@eit.uni-kl.de convert_SM_to_2C_trimmed(IF_SC_SIGNED, sgn, nbits, ndigits, d); 227912027Sjungma@eit.uni-kl.de 228012027Sjungma@eit.uni-kl.de while (--vnd >= 0) 228112027Sjungma@eit.uni-kl.de v = (v << BITS_PER_DIGIT) + d[vnd]; 228212027Sjungma@eit.uni-kl.de 228312027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 228412027Sjungma@eit.uni-kl.de delete [] d; 228512027Sjungma@eit.uni-kl.de#endif 228612027Sjungma@eit.uni-kl.de 228712027Sjungma@eit.uni-kl.de } 228812027Sjungma@eit.uni-kl.de else { 228912027Sjungma@eit.uni-kl.de 229012027Sjungma@eit.uni-kl.de while (--vnd >= 0) 229112027Sjungma@eit.uni-kl.de v = (v << BITS_PER_DIGIT) + digit[vnd]; 229212027Sjungma@eit.uni-kl.de 229312027Sjungma@eit.uni-kl.de } 229412027Sjungma@eit.uni-kl.de 229512027Sjungma@eit.uni-kl.de return v; 229612027Sjungma@eit.uni-kl.de} 229712027Sjungma@eit.uni-kl.de 229812027Sjungma@eit.uni-kl.de 229912027Sjungma@eit.uni-kl.deunsigned long 230012027Sjungma@eit.uni-kl.deCLASS_TYPE::to_ulong() const 230112027Sjungma@eit.uni-kl.de{ 230212027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) 230312027Sjungma@eit.uni-kl.de return 0; 230412027Sjungma@eit.uni-kl.de 230512027Sjungma@eit.uni-kl.de int vnd = sc_min((int)DIGITS_PER_LONG, ndigits); 230612027Sjungma@eit.uni-kl.de 230712027Sjungma@eit.uni-kl.de unsigned long v = 0; 230812027Sjungma@eit.uni-kl.de 230912027Sjungma@eit.uni-kl.de if (sgn == SC_NEG) { 231012027Sjungma@eit.uni-kl.de 231112027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 231212027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 231312027Sjungma@eit.uni-kl.de#else 231412027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[ndigits]; 231512027Sjungma@eit.uni-kl.de#endif 231612027Sjungma@eit.uni-kl.de 231712027Sjungma@eit.uni-kl.de vec_copy(ndigits, d, digit); 231812027Sjungma@eit.uni-kl.de 231912027Sjungma@eit.uni-kl.de convert_SM_to_2C_trimmed(IF_SC_SIGNED, sgn, nbits, ndigits, d); 232012027Sjungma@eit.uni-kl.de 232112027Sjungma@eit.uni-kl.de while (--vnd >= 0) 232212027Sjungma@eit.uni-kl.de v = (v << BITS_PER_DIGIT) + d[vnd]; 232312027Sjungma@eit.uni-kl.de 232412027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 232512027Sjungma@eit.uni-kl.de delete [] d; 232612027Sjungma@eit.uni-kl.de#endif 232712027Sjungma@eit.uni-kl.de 232812027Sjungma@eit.uni-kl.de } 232912027Sjungma@eit.uni-kl.de else { 233012027Sjungma@eit.uni-kl.de 233112027Sjungma@eit.uni-kl.de while (--vnd >= 0) 233212027Sjungma@eit.uni-kl.de v = (v << BITS_PER_DIGIT) + digit[vnd]; 233312027Sjungma@eit.uni-kl.de 233412027Sjungma@eit.uni-kl.de } 233512027Sjungma@eit.uni-kl.de 233612027Sjungma@eit.uni-kl.de return v; 233712027Sjungma@eit.uni-kl.de} 233812027Sjungma@eit.uni-kl.de 233912027Sjungma@eit.uni-kl.de 234012027Sjungma@eit.uni-kl.deunsigned int 234112027Sjungma@eit.uni-kl.deCLASS_TYPE::to_uint() const 234212027Sjungma@eit.uni-kl.de{ 234312027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) 234412027Sjungma@eit.uni-kl.de return 0; 234512027Sjungma@eit.uni-kl.de 234612027Sjungma@eit.uni-kl.de int vnd = sc_min((int)DIGITS_PER_INT, ndigits); 234712027Sjungma@eit.uni-kl.de 234812027Sjungma@eit.uni-kl.de unsigned int v = 0; 234912027Sjungma@eit.uni-kl.de 235012027Sjungma@eit.uni-kl.de if (sgn == SC_NEG) { 235112027Sjungma@eit.uni-kl.de 235212027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 235312027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 235412027Sjungma@eit.uni-kl.de#else 235512027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[ndigits]; 235612027Sjungma@eit.uni-kl.de#endif 235712027Sjungma@eit.uni-kl.de 235812027Sjungma@eit.uni-kl.de vec_copy(ndigits, d, digit); 235912027Sjungma@eit.uni-kl.de 236012027Sjungma@eit.uni-kl.de convert_SM_to_2C_trimmed(IF_SC_SIGNED, sgn, nbits, ndigits, d); 236112027Sjungma@eit.uni-kl.de 236212027Sjungma@eit.uni-kl.de while (--vnd >= 0) 236312027Sjungma@eit.uni-kl.de v = (v << BITS_PER_DIGIT) + d[vnd]; 236412027Sjungma@eit.uni-kl.de 236512027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 236612027Sjungma@eit.uni-kl.de delete [] d; 236712027Sjungma@eit.uni-kl.de#endif 236812027Sjungma@eit.uni-kl.de 236912027Sjungma@eit.uni-kl.de } 237012027Sjungma@eit.uni-kl.de else { 237112027Sjungma@eit.uni-kl.de 237212027Sjungma@eit.uni-kl.de while (--vnd >= 0) 237312027Sjungma@eit.uni-kl.de v = (v << BITS_PER_DIGIT) + digit[vnd]; 237412027Sjungma@eit.uni-kl.de 237512027Sjungma@eit.uni-kl.de } 237612027Sjungma@eit.uni-kl.de 237712027Sjungma@eit.uni-kl.de return v; 237812027Sjungma@eit.uni-kl.de} 237912027Sjungma@eit.uni-kl.de 238012027Sjungma@eit.uni-kl.de 238112027Sjungma@eit.uni-kl.de// Convert to double. 238212027Sjungma@eit.uni-kl.dedouble 238312027Sjungma@eit.uni-kl.deCLASS_TYPE::to_double() const 238412027Sjungma@eit.uni-kl.de{ 238512027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) 238612027Sjungma@eit.uni-kl.de return (double) 0.0; 238712027Sjungma@eit.uni-kl.de 238812027Sjungma@eit.uni-kl.de int vnd = ndigits; 238912027Sjungma@eit.uni-kl.de 239012027Sjungma@eit.uni-kl.de double v = 0.0; 239112027Sjungma@eit.uni-kl.de while (--vnd >= 0) 239212027Sjungma@eit.uni-kl.de v = v * DIGIT_RADIX + digit[vnd]; 239312027Sjungma@eit.uni-kl.de 239412027Sjungma@eit.uni-kl.de if (sgn == SC_NEG) 239512027Sjungma@eit.uni-kl.de return -v; 239612027Sjungma@eit.uni-kl.de else 239712027Sjungma@eit.uni-kl.de return v; 239812027Sjungma@eit.uni-kl.de} 239912027Sjungma@eit.uni-kl.de 240012027Sjungma@eit.uni-kl.de 240112027Sjungma@eit.uni-kl.de// Return true if the bit i is 1, false otherwise. If i is outside the 240212027Sjungma@eit.uni-kl.de// bounds, return 1/0 according to the sign of the number by assuming 240312027Sjungma@eit.uni-kl.de// that the number has infinite length. 240412027Sjungma@eit.uni-kl.de 240512027Sjungma@eit.uni-kl.debool 240612027Sjungma@eit.uni-kl.deCLASS_TYPE::test(int i) const 240712027Sjungma@eit.uni-kl.de{ 240812027Sjungma@eit.uni-kl.de#ifdef SC_SIGNED 240912027Sjungma@eit.uni-kl.de if (check_if_outside(i)) { 241012027Sjungma@eit.uni-kl.de if (sgn == SC_NEG) 241112027Sjungma@eit.uni-kl.de return 1; 241212027Sjungma@eit.uni-kl.de else 241312027Sjungma@eit.uni-kl.de return 0; 241412027Sjungma@eit.uni-kl.de } 241512027Sjungma@eit.uni-kl.de#else 241612027Sjungma@eit.uni-kl.de if (check_if_outside(i)) 241712027Sjungma@eit.uni-kl.de return 0; 241812027Sjungma@eit.uni-kl.de#endif 241912027Sjungma@eit.uni-kl.de 242012027Sjungma@eit.uni-kl.de int bit_num = bit_ord(i); 242112027Sjungma@eit.uni-kl.de int digit_num = digit_ord(i); 242212027Sjungma@eit.uni-kl.de 242312027Sjungma@eit.uni-kl.de if (sgn == SC_NEG) { 242412027Sjungma@eit.uni-kl.de 242512027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 242612027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 242712027Sjungma@eit.uni-kl.de#else 242812027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[ndigits]; 242912027Sjungma@eit.uni-kl.de#endif 243012027Sjungma@eit.uni-kl.de 243112027Sjungma@eit.uni-kl.de vec_copy(ndigits, d, digit); 243212027Sjungma@eit.uni-kl.de vec_complement(ndigits, d); 243312027Sjungma@eit.uni-kl.de bool val = ((d[digit_num] & one_and_zeros(bit_num)) != 0); 243412027Sjungma@eit.uni-kl.de 243512027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 243612027Sjungma@eit.uni-kl.de delete [] d; 243712027Sjungma@eit.uni-kl.de#endif 243812027Sjungma@eit.uni-kl.de 243912027Sjungma@eit.uni-kl.de return val; 244012027Sjungma@eit.uni-kl.de 244112027Sjungma@eit.uni-kl.de } 244212027Sjungma@eit.uni-kl.de else 244312027Sjungma@eit.uni-kl.de return ((digit[digit_num] & one_and_zeros(bit_num)) != 0); 244412027Sjungma@eit.uni-kl.de} 244512027Sjungma@eit.uni-kl.de 244612027Sjungma@eit.uni-kl.de 244712027Sjungma@eit.uni-kl.de// Set the ith bit with 1. 244812027Sjungma@eit.uni-kl.devoid 244912027Sjungma@eit.uni-kl.deCLASS_TYPE::set(int i) 245012027Sjungma@eit.uni-kl.de{ 245112027Sjungma@eit.uni-kl.de if (check_if_outside(i)) 245212027Sjungma@eit.uni-kl.de return; 245312027Sjungma@eit.uni-kl.de 245412027Sjungma@eit.uni-kl.de int bit_num = bit_ord(i); 245512027Sjungma@eit.uni-kl.de int digit_num = digit_ord(i); 245612027Sjungma@eit.uni-kl.de 245712027Sjungma@eit.uni-kl.de convert_SM_to_2C(); 245812027Sjungma@eit.uni-kl.de digit[digit_num] |= one_and_zeros(bit_num); 245912027Sjungma@eit.uni-kl.de digit[digit_num] &= DIGIT_MASK; // Needed to zero the overflow bits. 246012027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 246112027Sjungma@eit.uni-kl.de} 246212027Sjungma@eit.uni-kl.de 246312027Sjungma@eit.uni-kl.de 246412027Sjungma@eit.uni-kl.de// Set the ith bit with 0, i.e., clear the ith bit. 246512027Sjungma@eit.uni-kl.devoid 246612027Sjungma@eit.uni-kl.deCLASS_TYPE::clear(int i) 246712027Sjungma@eit.uni-kl.de{ 246812027Sjungma@eit.uni-kl.de if (check_if_outside(i)) 246912027Sjungma@eit.uni-kl.de return; 247012027Sjungma@eit.uni-kl.de 247112027Sjungma@eit.uni-kl.de int bit_num = bit_ord(i); 247212027Sjungma@eit.uni-kl.de int digit_num = digit_ord(i); 247312027Sjungma@eit.uni-kl.de 247412027Sjungma@eit.uni-kl.de convert_SM_to_2C(); 247512027Sjungma@eit.uni-kl.de digit[digit_num] &= ~(one_and_zeros(bit_num)); 247612027Sjungma@eit.uni-kl.de digit[digit_num] &= DIGIT_MASK; // Needed to zero the overflow bits. 247712027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 247812027Sjungma@eit.uni-kl.de} 247912027Sjungma@eit.uni-kl.de 248012027Sjungma@eit.uni-kl.de 248112027Sjungma@eit.uni-kl.de// Create a mirror image of the number. 248212027Sjungma@eit.uni-kl.devoid 248312027Sjungma@eit.uni-kl.deCLASS_TYPE::reverse() 248412027Sjungma@eit.uni-kl.de{ 248512027Sjungma@eit.uni-kl.de convert_SM_to_2C(); 248612027Sjungma@eit.uni-kl.de vec_reverse(length(), ndigits, digit, length() - 1); 248712027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 248812027Sjungma@eit.uni-kl.de} 248912027Sjungma@eit.uni-kl.de 249012027Sjungma@eit.uni-kl.de 249112027Sjungma@eit.uni-kl.de// Get a packed bit representation of the number. 249212027Sjungma@eit.uni-kl.devoid 249312027Sjungma@eit.uni-kl.deCLASS_TYPE::get_packed_rep(sc_digit *buf) const 249412027Sjungma@eit.uni-kl.de{ 249512027Sjungma@eit.uni-kl.de int buf_ndigits = (length() - 1) / BITS_PER_DIGIT_TYPE + 1; 249612027Sjungma@eit.uni-kl.de 249712027Sjungma@eit.uni-kl.de // Initialize buf to zero. 249812027Sjungma@eit.uni-kl.de vec_zero(buf_ndigits, buf); 249912027Sjungma@eit.uni-kl.de 250012027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) 250112027Sjungma@eit.uni-kl.de return; 250212027Sjungma@eit.uni-kl.de 250312027Sjungma@eit.uni-kl.de const sc_digit *digit_or_d; 250412027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 250512027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 250612027Sjungma@eit.uni-kl.de#else 250712027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[ndigits]; 250812027Sjungma@eit.uni-kl.de#endif 250912027Sjungma@eit.uni-kl.de 251012027Sjungma@eit.uni-kl.de if (sgn == SC_POS) 251112027Sjungma@eit.uni-kl.de digit_or_d = digit; 251212027Sjungma@eit.uni-kl.de 251312027Sjungma@eit.uni-kl.de else 251412027Sjungma@eit.uni-kl.de { 251512027Sjungma@eit.uni-kl.de // If sgn is negative, we have to convert digit to its 2's 251612027Sjungma@eit.uni-kl.de // complement. Since this function is const, we can not do it on 251712027Sjungma@eit.uni-kl.de // digit. Since buf doesn't have overflow bits, we cannot also do 251812027Sjungma@eit.uni-kl.de // it on buf. Thus, we have to do the complementation on a copy of 251912027Sjungma@eit.uni-kl.de // digit, i.e., on d. 252012027Sjungma@eit.uni-kl.de 252112027Sjungma@eit.uni-kl.de vec_copy(ndigits, d, digit); 252212027Sjungma@eit.uni-kl.de vec_complement(ndigits, d); 252312027Sjungma@eit.uni-kl.de 252412027Sjungma@eit.uni-kl.de buf[buf_ndigits - 1] = ~((sc_digit) 0); 252512027Sjungma@eit.uni-kl.de 252612027Sjungma@eit.uni-kl.de digit_or_d = d; 252712027Sjungma@eit.uni-kl.de 252812027Sjungma@eit.uni-kl.de } 252912027Sjungma@eit.uni-kl.de 253012027Sjungma@eit.uni-kl.de // Copy the bits from digit to buf. The division and mod operations 253112027Sjungma@eit.uni-kl.de // below can be converted to addition/subtraction and comparison 253212027Sjungma@eit.uni-kl.de // operations at the expense of complicating the code. We can do it 253312027Sjungma@eit.uni-kl.de // if we see any performance problems. 253412027Sjungma@eit.uni-kl.de 253512027Sjungma@eit.uni-kl.de for (int i = length() - 1; i >= 0; --i) { 253612027Sjungma@eit.uni-kl.de 253712027Sjungma@eit.uni-kl.de if ((digit_or_d[digit_ord(i)] & one_and_zeros(bit_ord(i))) != 0) // Test. 253812027Sjungma@eit.uni-kl.de 253912027Sjungma@eit.uni-kl.de buf[i / BITS_PER_DIGIT_TYPE] |= 254012027Sjungma@eit.uni-kl.de one_and_zeros(i % BITS_PER_DIGIT_TYPE); // Set. 254112027Sjungma@eit.uni-kl.de 254212027Sjungma@eit.uni-kl.de else 254312027Sjungma@eit.uni-kl.de 254412027Sjungma@eit.uni-kl.de buf[i / BITS_PER_DIGIT_TYPE] &= 254512027Sjungma@eit.uni-kl.de ~(one_and_zeros(i % BITS_PER_DIGIT_TYPE)); // Clear. 254612027Sjungma@eit.uni-kl.de 254712027Sjungma@eit.uni-kl.de } 254812027Sjungma@eit.uni-kl.de 254912027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 255012027Sjungma@eit.uni-kl.de delete[] d; 255112027Sjungma@eit.uni-kl.de#endif 255212027Sjungma@eit.uni-kl.de} 255312027Sjungma@eit.uni-kl.de 255412027Sjungma@eit.uni-kl.de 255512027Sjungma@eit.uni-kl.de// Set a packed bit representation of the number. 255612027Sjungma@eit.uni-kl.devoid 255712027Sjungma@eit.uni-kl.deCLASS_TYPE::set_packed_rep(sc_digit *buf) 255812027Sjungma@eit.uni-kl.de{ 255912027Sjungma@eit.uni-kl.de // Initialize digit to zero. 256012027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 256112027Sjungma@eit.uni-kl.de 256212027Sjungma@eit.uni-kl.de // Copy the bits from buf to digit. 256312027Sjungma@eit.uni-kl.de for (int i = length() - 1; i >= 0; --i) { 256412027Sjungma@eit.uni-kl.de 256512027Sjungma@eit.uni-kl.de if ((buf[i / BITS_PER_DIGIT_TYPE] & 256612027Sjungma@eit.uni-kl.de one_and_zeros(i % BITS_PER_DIGIT_TYPE)) != 0) // Test. 256712027Sjungma@eit.uni-kl.de 256812027Sjungma@eit.uni-kl.de digit[digit_ord(i)] |= one_and_zeros(bit_ord(i)); // Set. 256912027Sjungma@eit.uni-kl.de 257012027Sjungma@eit.uni-kl.de else 257112027Sjungma@eit.uni-kl.de 257212027Sjungma@eit.uni-kl.de digit[digit_ord(i)] &= ~(one_and_zeros(bit_ord(i))); // Clear 257312027Sjungma@eit.uni-kl.de 257412027Sjungma@eit.uni-kl.de } 257512027Sjungma@eit.uni-kl.de 257612027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 257712027Sjungma@eit.uni-kl.de} 257812027Sjungma@eit.uni-kl.de 257912027Sjungma@eit.uni-kl.de 258012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 258112027Sjungma@eit.uni-kl.de// SECTION: Private members. 258212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 258312027Sjungma@eit.uni-kl.de 258412027Sjungma@eit.uni-kl.de// Create a copy of v with sgn s. 258512027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const CLASS_TYPE& v, small_type s) : 258612027Sjungma@eit.uni-kl.de sc_value_base(v), sgn(s), nbits(v.nbits), ndigits(v.ndigits), digit() 258712027Sjungma@eit.uni-kl.de{ 258812027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 258912027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 259012027Sjungma@eit.uni-kl.de#endif 259112027Sjungma@eit.uni-kl.de 259212027Sjungma@eit.uni-kl.de vec_copy(ndigits, digit, v.digit); 259312027Sjungma@eit.uni-kl.de} 259412027Sjungma@eit.uni-kl.de 259512027Sjungma@eit.uni-kl.de 259612027Sjungma@eit.uni-kl.de// Create a copy of v where v is of the different type. 259712027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const OTHER_CLASS_TYPE& v, small_type s) : 259812027Sjungma@eit.uni-kl.de sc_value_base(v), sgn(s), nbits(num_bits(v.nbits)), ndigits(), digit() 259912027Sjungma@eit.uni-kl.de{ 260012027Sjungma@eit.uni-kl.de#if (IF_SC_SIGNED == 1) 260112027Sjungma@eit.uni-kl.de ndigits = v.ndigits; 260212027Sjungma@eit.uni-kl.de#else 260312027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 260412027Sjungma@eit.uni-kl.de#endif 260512027Sjungma@eit.uni-kl.de 260612027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 260712027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 260812027Sjungma@eit.uni-kl.de#endif 260912027Sjungma@eit.uni-kl.de 261012027Sjungma@eit.uni-kl.de copy_digits(v.nbits, v.ndigits, v.digit); 261112027Sjungma@eit.uni-kl.de} 261212027Sjungma@eit.uni-kl.de 261312027Sjungma@eit.uni-kl.de 261412027Sjungma@eit.uni-kl.de// Create a signed number with (s, nb, nd, d) as its attributes (as 261512027Sjungma@eit.uni-kl.de// defined in class CLASS_TYPE). If alloc is set, delete d. 261612027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(small_type s, int nb, 261712027Sjungma@eit.uni-kl.de int nd, sc_digit *d, 261812027Sjungma@eit.uni-kl.de bool alloc) : 261912027Sjungma@eit.uni-kl.de sc_value_base(), sgn(s), nbits(num_bits(nb)), ndigits(), digit() 262012027Sjungma@eit.uni-kl.de{ 262112027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 262212027Sjungma@eit.uni-kl.de 262312027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 262412027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 262512027Sjungma@eit.uni-kl.de#endif 262612027Sjungma@eit.uni-kl.de 262712027Sjungma@eit.uni-kl.de if (ndigits <= nd) 262812027Sjungma@eit.uni-kl.de vec_copy(ndigits, digit, d); 262912027Sjungma@eit.uni-kl.de else 263012027Sjungma@eit.uni-kl.de vec_copy_and_zero(ndigits, digit, nd, d); 263112027Sjungma@eit.uni-kl.de 263212027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 263312027Sjungma@eit.uni-kl.de if (alloc) 263412027Sjungma@eit.uni-kl.de delete [] d; 263512027Sjungma@eit.uni-kl.de#endif 263612027Sjungma@eit.uni-kl.de} 263712027Sjungma@eit.uni-kl.de 263812027Sjungma@eit.uni-kl.de// This constructor is mainly used in finding a "range" of bits from a 263912027Sjungma@eit.uni-kl.de// number of type CLASS_TYPE. The function range(l, r) can have 264012027Sjungma@eit.uni-kl.de// arbitrary precedence between l and r. If l is smaller than r, then 264112027Sjungma@eit.uni-kl.de// the output is the reverse of range(r, l). 264212027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const CLASS_TYPE* u, int l, int r) : 264312027Sjungma@eit.uni-kl.de sc_value_base(), sgn(), nbits(), ndigits(), digit() 264412027Sjungma@eit.uni-kl.de{ 264512027Sjungma@eit.uni-kl.de bool reversed = false; 264612027Sjungma@eit.uni-kl.de 264712027Sjungma@eit.uni-kl.de if( l < r ) { 264812027Sjungma@eit.uni-kl.de reversed = true; 264912027Sjungma@eit.uni-kl.de int tmp = l; 265012027Sjungma@eit.uni-kl.de l = r; 265112027Sjungma@eit.uni-kl.de r = tmp; 265212027Sjungma@eit.uni-kl.de } 265312027Sjungma@eit.uni-kl.de 265412027Sjungma@eit.uni-kl.de // at this point, l >= r 265512027Sjungma@eit.uni-kl.de 265612027Sjungma@eit.uni-kl.de // make sure that l and r point to the bits of u 265712027Sjungma@eit.uni-kl.de r = sc_max( r, 0 ); 265812027Sjungma@eit.uni-kl.de l = sc_min( l, u->nbits - 1 ); 265912027Sjungma@eit.uni-kl.de 266012027Sjungma@eit.uni-kl.de nbits = num_bits( l - r + 1 ); 266112027Sjungma@eit.uni-kl.de 266212027Sjungma@eit.uni-kl.de // nbits can still be <= 0 because l and r have just been updated 266312027Sjungma@eit.uni-kl.de // with the bounds of u. 266412027Sjungma@eit.uni-kl.de 266512027Sjungma@eit.uni-kl.de // if u == 0 or the range is out of bounds, return 0 266612027Sjungma@eit.uni-kl.de if( u->sgn == SC_ZERO || nbits <= num_bits( 0 ) ) { 266712027Sjungma@eit.uni-kl.de sgn = SC_ZERO; 266812027Sjungma@eit.uni-kl.de if( nbits <= num_bits( 0 ) ) { 266912027Sjungma@eit.uni-kl.de nbits = 1; 267012027Sjungma@eit.uni-kl.de } 267112027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL( nbits ); 267212027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 267312027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 267412027Sjungma@eit.uni-kl.de#endif 267512027Sjungma@eit.uni-kl.de vec_zero( ndigits, digit ); 267612027Sjungma@eit.uni-kl.de return; 267712027Sjungma@eit.uni-kl.de } 267812027Sjungma@eit.uni-kl.de 267912027Sjungma@eit.uni-kl.de // The rest will be executed if u is not zero. 268012027Sjungma@eit.uni-kl.de 268112027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 268212027Sjungma@eit.uni-kl.de 268312027Sjungma@eit.uni-kl.de // The number of bits up to and including l and r, respectively. 268412027Sjungma@eit.uni-kl.de int nl = l + 1; 268512027Sjungma@eit.uni-kl.de int nr = r + 1; 268612027Sjungma@eit.uni-kl.de 268712027Sjungma@eit.uni-kl.de // The indices of the digits that have lth and rth bits, respectively. 268812027Sjungma@eit.uni-kl.de int left_digit = DIV_CEIL(nl) - 1; 268912027Sjungma@eit.uni-kl.de int right_digit = DIV_CEIL(nr) - 1; 269012027Sjungma@eit.uni-kl.de 269112027Sjungma@eit.uni-kl.de int nd; 269212027Sjungma@eit.uni-kl.de 269312027Sjungma@eit.uni-kl.de // The range is performed on the 2's complement representation, so 269412027Sjungma@eit.uni-kl.de // first get the indices for that. 269512027Sjungma@eit.uni-kl.de if (u->sgn == SC_NEG) 269612027Sjungma@eit.uni-kl.de nd = left_digit + 1; 269712027Sjungma@eit.uni-kl.de else 269812027Sjungma@eit.uni-kl.de nd = left_digit - right_digit + 1; 269912027Sjungma@eit.uni-kl.de 270012027Sjungma@eit.uni-kl.de // Allocate memory for the range. 270112027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 270212027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 270312027Sjungma@eit.uni-kl.de#else 270412027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 270512027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[nd]; 270612027Sjungma@eit.uni-kl.de#endif 270712027Sjungma@eit.uni-kl.de 270812027Sjungma@eit.uni-kl.de // Getting the range on the 2's complement representation. 270912027Sjungma@eit.uni-kl.de if (u->sgn == SC_NEG) { 271012027Sjungma@eit.uni-kl.de 271112027Sjungma@eit.uni-kl.de vec_copy(nd, d, u->digit); 271212027Sjungma@eit.uni-kl.de vec_complement(nd, d); // d = -d; 271312027Sjungma@eit.uni-kl.de vec_shift_right(nd, d, r, DIGIT_MASK); 271412027Sjungma@eit.uni-kl.de 271512027Sjungma@eit.uni-kl.de } 271612027Sjungma@eit.uni-kl.de else { 271712027Sjungma@eit.uni-kl.de 271812027Sjungma@eit.uni-kl.de for (int i = right_digit; i <= left_digit; ++i) 271912027Sjungma@eit.uni-kl.de d[i - right_digit] = u->digit[i]; 272012027Sjungma@eit.uni-kl.de 272112027Sjungma@eit.uni-kl.de vec_shift_right(nd, d, r - right_digit * BITS_PER_DIGIT, 0); 272212027Sjungma@eit.uni-kl.de 272312027Sjungma@eit.uni-kl.de } 272412027Sjungma@eit.uni-kl.de 272512027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 272612027Sjungma@eit.uni-kl.de 272712027Sjungma@eit.uni-kl.de if (! reversed) 272812027Sjungma@eit.uni-kl.de vec_copy(sc_min(nd, ndigits), digit, d); 272912027Sjungma@eit.uni-kl.de 273012027Sjungma@eit.uni-kl.de else { 273112027Sjungma@eit.uni-kl.de 273212027Sjungma@eit.uni-kl.de // If l < r, i.e., reversed is set, reverse the bits of digit. d 273312027Sjungma@eit.uni-kl.de // will be used as a temporary store. The following code tries to 273412027Sjungma@eit.uni-kl.de // minimize the use of bit_ord and digit_ord, which use mod and 273512027Sjungma@eit.uni-kl.de // div operators. Since these operators are function calls to 273612027Sjungma@eit.uni-kl.de // standard library routines, they are slow. The main idea in 273712027Sjungma@eit.uni-kl.de // reversing is "read bits out of d from left to right and push 273812027Sjungma@eit.uni-kl.de // them into digit using right shifting." 273912027Sjungma@eit.uni-kl.de 274012027Sjungma@eit.uni-kl.de // Take care of the last digit. 274112027Sjungma@eit.uni-kl.de int nd_less_1 = nd - 1; 274212027Sjungma@eit.uni-kl.de 274312027Sjungma@eit.uni-kl.de // Deletions will start from the left end and move one position 274412027Sjungma@eit.uni-kl.de // after each deletion. 274512027Sjungma@eit.uni-kl.de sc_digit del_mask = one_and_zeros(bit_ord(l - r)); 274612027Sjungma@eit.uni-kl.de 274712027Sjungma@eit.uni-kl.de while (del_mask) { 274812027Sjungma@eit.uni-kl.de vec_shift_right(ndigits, digit, 1, ((d[nd_less_1] & del_mask) != 0)); 274912027Sjungma@eit.uni-kl.de del_mask >>= 1; 275012027Sjungma@eit.uni-kl.de } 275112027Sjungma@eit.uni-kl.de 275212027Sjungma@eit.uni-kl.de // Take care of the other digits if any. 275312027Sjungma@eit.uni-kl.de 275412027Sjungma@eit.uni-kl.de // Insertion to digit will always occur at the left end. 275512027Sjungma@eit.uni-kl.de sc_digit ins_mask = one_and_zeros(BITS_PER_DIGIT - 1); 275612027Sjungma@eit.uni-kl.de 275712027Sjungma@eit.uni-kl.de for (int j = nd - 2; j >= 0; --j) { // j = nd - 2 275812027Sjungma@eit.uni-kl.de 275912027Sjungma@eit.uni-kl.de // Deletions will start from the left end and move one position 276012027Sjungma@eit.uni-kl.de // after each deletion. 276112027Sjungma@eit.uni-kl.de del_mask = ins_mask; 276212027Sjungma@eit.uni-kl.de 276312027Sjungma@eit.uni-kl.de while (del_mask) { 276412027Sjungma@eit.uni-kl.de vec_shift_right(ndigits, digit, 1, ((d[j] & del_mask) != 0)); 276512027Sjungma@eit.uni-kl.de del_mask >>= 1; 276612027Sjungma@eit.uni-kl.de } 276712027Sjungma@eit.uni-kl.de } 276812027Sjungma@eit.uni-kl.de 276912027Sjungma@eit.uni-kl.de if (u->sgn == SC_NEG) 277012027Sjungma@eit.uni-kl.de vec_shift_right(ndigits, digit, 277112027Sjungma@eit.uni-kl.de ndigits * BITS_PER_DIGIT - length(), DIGIT_MASK); 277212027Sjungma@eit.uni-kl.de else 277312027Sjungma@eit.uni-kl.de vec_shift_right(ndigits, digit, 277412027Sjungma@eit.uni-kl.de ndigits * BITS_PER_DIGIT - length(), 0); 277512027Sjungma@eit.uni-kl.de 277612027Sjungma@eit.uni-kl.de 277712027Sjungma@eit.uni-kl.de } // if reversed. 277812027Sjungma@eit.uni-kl.de 277912027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 278012027Sjungma@eit.uni-kl.de 278112027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 278212027Sjungma@eit.uni-kl.de delete [] d; 278312027Sjungma@eit.uni-kl.de#endif 278412027Sjungma@eit.uni-kl.de} 278512027Sjungma@eit.uni-kl.de 278612027Sjungma@eit.uni-kl.de// This constructor is mainly used in finding a "range" of bits from a 278712027Sjungma@eit.uni-kl.de// number of type OTHER_CLASS_TYPE. The function range(l, r) can have 278812027Sjungma@eit.uni-kl.de// arbitrary precedence between l and r. If l is smaller than r, then 278912027Sjungma@eit.uni-kl.de// the output is the reverse of range(r, l). 279012027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const OTHER_CLASS_TYPE* u, int l, int r) : 279112027Sjungma@eit.uni-kl.de sc_value_base(), sgn(), nbits(), ndigits(), digit() 279212027Sjungma@eit.uni-kl.de{ 279312027Sjungma@eit.uni-kl.de bool reversed = false; 279412027Sjungma@eit.uni-kl.de 279512027Sjungma@eit.uni-kl.de if( l < r ) { 279612027Sjungma@eit.uni-kl.de reversed = true; 279712027Sjungma@eit.uni-kl.de int tmp = l; 279812027Sjungma@eit.uni-kl.de l = r; 279912027Sjungma@eit.uni-kl.de r = tmp; 280012027Sjungma@eit.uni-kl.de } 280112027Sjungma@eit.uni-kl.de 280212027Sjungma@eit.uni-kl.de // at this point, l >= r 280312027Sjungma@eit.uni-kl.de 280412027Sjungma@eit.uni-kl.de // make sure that l and r point to the bits of u 280512027Sjungma@eit.uni-kl.de r = sc_max( r, 0 ); 280612027Sjungma@eit.uni-kl.de l = sc_min( l, u->nbits - 1 ); 280712027Sjungma@eit.uni-kl.de 280812027Sjungma@eit.uni-kl.de nbits = num_bits( l - r + 1 ); 280912027Sjungma@eit.uni-kl.de 281012027Sjungma@eit.uni-kl.de // nbits can still be <= 0 because l and r have just been updated 281112027Sjungma@eit.uni-kl.de // with the bounds of u. 281212027Sjungma@eit.uni-kl.de 281312027Sjungma@eit.uni-kl.de // if u == 0 or the range is out of bounds, return 0 281412027Sjungma@eit.uni-kl.de if( u->sgn == SC_ZERO || nbits <= num_bits( 0 ) ) { 281512027Sjungma@eit.uni-kl.de sgn = SC_ZERO; 281612027Sjungma@eit.uni-kl.de if( nbits <= num_bits( 0 ) ) { 281712027Sjungma@eit.uni-kl.de nbits = 1; 281812027Sjungma@eit.uni-kl.de } 281912027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL( nbits ); 282012027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 282112027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 282212027Sjungma@eit.uni-kl.de#endif 282312027Sjungma@eit.uni-kl.de vec_zero( ndigits, digit ); 282412027Sjungma@eit.uni-kl.de return; 282512027Sjungma@eit.uni-kl.de } 282612027Sjungma@eit.uni-kl.de 282712027Sjungma@eit.uni-kl.de // The rest will be executed if u is not zero. 282812027Sjungma@eit.uni-kl.de 282912027Sjungma@eit.uni-kl.de ndigits = DIV_CEIL(nbits); 283012027Sjungma@eit.uni-kl.de 283112027Sjungma@eit.uni-kl.de // The number of bits up to and including l and r, respectively. 283212027Sjungma@eit.uni-kl.de int nl = l + 1; 283312027Sjungma@eit.uni-kl.de int nr = r + 1; 283412027Sjungma@eit.uni-kl.de 283512027Sjungma@eit.uni-kl.de // The indices of the digits that have lth and rth bits, respectively. 283612027Sjungma@eit.uni-kl.de int left_digit = DIV_CEIL(nl) - 1; 283712027Sjungma@eit.uni-kl.de int right_digit = DIV_CEIL(nr) - 1; 283812027Sjungma@eit.uni-kl.de 283912027Sjungma@eit.uni-kl.de int nd; 284012027Sjungma@eit.uni-kl.de 284112027Sjungma@eit.uni-kl.de // The range is performed on the 2's complement representation, so 284212027Sjungma@eit.uni-kl.de // first get the indices for that. 284312027Sjungma@eit.uni-kl.de if (u->sgn == SC_NEG) 284412027Sjungma@eit.uni-kl.de nd = left_digit + 1; 284512027Sjungma@eit.uni-kl.de else 284612027Sjungma@eit.uni-kl.de nd = left_digit - right_digit + 1; 284712027Sjungma@eit.uni-kl.de 284812027Sjungma@eit.uni-kl.de // Allocate memory for the range. 284912027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 285012027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 285112027Sjungma@eit.uni-kl.de#else 285212027Sjungma@eit.uni-kl.de digit = new sc_digit[ndigits]; 285312027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[nd]; 285412027Sjungma@eit.uni-kl.de#endif 285512027Sjungma@eit.uni-kl.de 285612027Sjungma@eit.uni-kl.de // Getting the range on the 2's complement representation. 285712027Sjungma@eit.uni-kl.de if (u->sgn == SC_NEG) { 285812027Sjungma@eit.uni-kl.de 285912027Sjungma@eit.uni-kl.de vec_copy(nd, d, u->digit); 286012027Sjungma@eit.uni-kl.de vec_complement(nd, d); // d = -d; 286112027Sjungma@eit.uni-kl.de vec_shift_right(nd, d, r, DIGIT_MASK); 286212027Sjungma@eit.uni-kl.de 286312027Sjungma@eit.uni-kl.de } 286412027Sjungma@eit.uni-kl.de else { 286512027Sjungma@eit.uni-kl.de 286612027Sjungma@eit.uni-kl.de for (int i = right_digit; i <= left_digit; ++i) 286712027Sjungma@eit.uni-kl.de d[i - right_digit] = u->digit[i]; 286812027Sjungma@eit.uni-kl.de 286912027Sjungma@eit.uni-kl.de vec_shift_right(nd, d, r - right_digit * BITS_PER_DIGIT, 0); 287012027Sjungma@eit.uni-kl.de 287112027Sjungma@eit.uni-kl.de } 287212027Sjungma@eit.uni-kl.de 287312027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 287412027Sjungma@eit.uni-kl.de 287512027Sjungma@eit.uni-kl.de if (! reversed) 287612027Sjungma@eit.uni-kl.de vec_copy(sc_min(nd, ndigits), digit, d); 287712027Sjungma@eit.uni-kl.de 287812027Sjungma@eit.uni-kl.de else { 287912027Sjungma@eit.uni-kl.de 288012027Sjungma@eit.uni-kl.de // If l < r, i.e., reversed is set, reverse the bits of digit. d 288112027Sjungma@eit.uni-kl.de // will be used as a temporary store. The following code tries to 288212027Sjungma@eit.uni-kl.de // minimize the use of bit_ord and digit_ord, which use mod and 288312027Sjungma@eit.uni-kl.de // div operators. Since these operators are function calls to 288412027Sjungma@eit.uni-kl.de // standard library routines, they are slow. The main idea in 288512027Sjungma@eit.uni-kl.de // reversing is "read bits out of d from left to right and push 288612027Sjungma@eit.uni-kl.de // them into digit using right shifting." 288712027Sjungma@eit.uni-kl.de 288812027Sjungma@eit.uni-kl.de // Take care of the last digit. 288912027Sjungma@eit.uni-kl.de int nd_less_1 = nd - 1; 289012027Sjungma@eit.uni-kl.de 289112027Sjungma@eit.uni-kl.de // Deletions will start from the left end and move one position 289212027Sjungma@eit.uni-kl.de // after each deletion. 289312027Sjungma@eit.uni-kl.de sc_digit del_mask = one_and_zeros(bit_ord(l - r)); 289412027Sjungma@eit.uni-kl.de 289512027Sjungma@eit.uni-kl.de while (del_mask) { 289612027Sjungma@eit.uni-kl.de vec_shift_right(ndigits, digit, 1, ((d[nd_less_1] & del_mask) != 0)); 289712027Sjungma@eit.uni-kl.de del_mask >>= 1; 289812027Sjungma@eit.uni-kl.de } 289912027Sjungma@eit.uni-kl.de 290012027Sjungma@eit.uni-kl.de // Take care of the other digits if any. 290112027Sjungma@eit.uni-kl.de 290212027Sjungma@eit.uni-kl.de // Insertion to digit will always occur at the left end. 290312027Sjungma@eit.uni-kl.de sc_digit ins_mask = one_and_zeros(BITS_PER_DIGIT - 1); 290412027Sjungma@eit.uni-kl.de 290512027Sjungma@eit.uni-kl.de for (int j = nd - 2; j >= 0; --j) { // j = nd - 2 290612027Sjungma@eit.uni-kl.de 290712027Sjungma@eit.uni-kl.de // Deletions will start from the left end and move one position 290812027Sjungma@eit.uni-kl.de // after each deletion. 290912027Sjungma@eit.uni-kl.de del_mask = ins_mask; 291012027Sjungma@eit.uni-kl.de 291112027Sjungma@eit.uni-kl.de while (del_mask) { 291212027Sjungma@eit.uni-kl.de vec_shift_right(ndigits, digit, 1, ((d[j] & del_mask) != 0)); 291312027Sjungma@eit.uni-kl.de del_mask >>= 1; 291412027Sjungma@eit.uni-kl.de } 291512027Sjungma@eit.uni-kl.de } 291612027Sjungma@eit.uni-kl.de 291712027Sjungma@eit.uni-kl.de if (u->sgn == SC_NEG) 291812027Sjungma@eit.uni-kl.de vec_shift_right(ndigits, digit, 291912027Sjungma@eit.uni-kl.de ndigits * BITS_PER_DIGIT - length(), DIGIT_MASK); 292012027Sjungma@eit.uni-kl.de else 292112027Sjungma@eit.uni-kl.de vec_shift_right(ndigits, digit, 292212027Sjungma@eit.uni-kl.de ndigits * BITS_PER_DIGIT - length(), 0); 292312027Sjungma@eit.uni-kl.de 292412027Sjungma@eit.uni-kl.de 292512027Sjungma@eit.uni-kl.de } // if reversed. 292612027Sjungma@eit.uni-kl.de 292712027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 292812027Sjungma@eit.uni-kl.de 292912027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 293012027Sjungma@eit.uni-kl.de delete [] d; 293112027Sjungma@eit.uni-kl.de#endif 293212027Sjungma@eit.uni-kl.de} 293312027Sjungma@eit.uni-kl.de 293412027Sjungma@eit.uni-kl.de 293512027Sjungma@eit.uni-kl.de// Print out all the physical attributes. 293612027Sjungma@eit.uni-kl.devoid 293712027Sjungma@eit.uni-kl.deCLASS_TYPE::dump(::std::ostream& os) const 293812027Sjungma@eit.uni-kl.de{ 293912027Sjungma@eit.uni-kl.de // Save the current setting, and set the base to decimal. 294012027Sjungma@eit.uni-kl.de#if defined(__MINGW32__) 294112027Sjungma@eit.uni-kl.de std::_Ios_Fmtflags old_flags = os.setf(::std::ios::dec,::std::ios::basefield); 294212027Sjungma@eit.uni-kl.de#else 294312027Sjungma@eit.uni-kl.de fmtflags old_flags = os.setf(::std::ios::dec, ::std::ios::basefield); 294412027Sjungma@eit.uni-kl.de#endif 294512027Sjungma@eit.uni-kl.de 294612027Sjungma@eit.uni-kl.de os << "width = " << length() << ::std::endl; 294712027Sjungma@eit.uni-kl.de os << "value = " << *this << ::std::endl; 294812027Sjungma@eit.uni-kl.de os << "bits = "; 294912027Sjungma@eit.uni-kl.de 295012027Sjungma@eit.uni-kl.de int len = length(); 295112027Sjungma@eit.uni-kl.de 295212027Sjungma@eit.uni-kl.de for (int i = len - 1; i >= 0; --i) { 295312027Sjungma@eit.uni-kl.de 295412027Sjungma@eit.uni-kl.de os << "01"[test(i)]; 295512027Sjungma@eit.uni-kl.de if (--len % 4 == 0) 295612027Sjungma@eit.uni-kl.de os << " "; 295712027Sjungma@eit.uni-kl.de 295812027Sjungma@eit.uni-kl.de } 295912027Sjungma@eit.uni-kl.de 296012027Sjungma@eit.uni-kl.de os << ::std::endl; 296112027Sjungma@eit.uni-kl.de 296212027Sjungma@eit.uni-kl.de // Restore old_flags. 296312027Sjungma@eit.uni-kl.de os.setf(old_flags, ::std::ios::basefield); 296412027Sjungma@eit.uni-kl.de} 296512027Sjungma@eit.uni-kl.de 296612027Sjungma@eit.uni-kl.de 296712027Sjungma@eit.uni-kl.de// Checks to see if bit_num is out of bounds. 296812027Sjungma@eit.uni-kl.debool 296912027Sjungma@eit.uni-kl.deCLASS_TYPE::check_if_outside(int bit_num) const 297012027Sjungma@eit.uni-kl.de{ 297112027Sjungma@eit.uni-kl.de if ((bit_num < 0) || (num_bits(bit_num) >= nbits)) { 297212027Sjungma@eit.uni-kl.de 297312027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC 297412027Sjungma@eit.uni-kl.de if( bit_num < 0 || bit_num >= nbits ) { 297512027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 297612027Sjungma@eit.uni-kl.de std::sprintf( msg, "%s::check_if_outside( int bit_num ) : " 297712027Sjungma@eit.uni-kl.de "bit_num = %d is out of bounds", 297812027Sjungma@eit.uni-kl.de CLASS_TYPE_STR, bit_num ); 297912027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 298012027Sjungma@eit.uni-kl.de } 298112027Sjungma@eit.uni-kl.de#endif 298212027Sjungma@eit.uni-kl.de 298312027Sjungma@eit.uni-kl.de return true; 298412027Sjungma@eit.uni-kl.de } 298512027Sjungma@eit.uni-kl.de 298612027Sjungma@eit.uni-kl.de return false; 298712027Sjungma@eit.uni-kl.de} 298812027Sjungma@eit.uni-kl.de 298912027Sjungma@eit.uni-kl.de// End of file. 2990