예제 #1
0
 BigNumber(const unsigned char* bytes, size_t bytes_length, int32_t scale)
   : big_number_(BN_new())
   , scale_(scale) {
   if (bytes && bytes_length > 0) {
     // Determine if value is negative and handle two's complement
     bool is_negative = ((bytes[0] & 0x80) != 0);
     if (is_negative) {
       // Create a copy and convert to two's complement
       std::vector<unsigned char> twos_complement(bytes_length);
       memcpy(&twos_complement[0], bytes, bytes_length);
       bool is_carry = true;
       for (ssize_t i = bytes_length - 1; i >= 0; --i) {
         twos_complement[i] ^= 0xFF;
         if (is_carry) {
           is_carry = ((++twos_complement[i]) == 0);
         }
       }
       big_number_ = BN_bin2bn(&twos_complement[0], bytes_length, NULL);
       BN_set_negative(big_number_.get(), 1);
     } else {
       big_number_ = BN_bin2bn(bytes, bytes_length, NULL);
       BN_set_negative(big_number_.get(), 0);
     }
   } else {
     BIGNUM* bignum = big_number_.get();
     BN_zero(bignum);
     scale_ = 0;
   }
 }
예제 #2
0
int main(int argc, char *argv[]) {
	int rc = TRUE;
	char in_str[256], out_str[256];
	scanf("%s", in_str);
	twos_complement(in_str, out_str);
	printf("%s\n", out_str);
	return rc;
}
예제 #3
0
파일: ast_util.c 프로젝트: bufans/odin-ii
/*---------------------------------------------------------------------------------------------
 * (function: *create_tree_node_long_long_number)
 *-------------------------------------------------------------------------------------------*/
ast_node_t *create_tree_node_long_long_number(long long number, int constant_bit_size, int line_number, int file_number)
{
    int flag = 0;
    ast_node_t* new_node = create_node_w_type(NUMBERS, line_number, current_parse_file);
    new_node->types.number.base = LONG_LONG;
    new_node->types.number.value = number;

    if (number < 0)
    {
        flag = 1;
        number = number * -1;
    }

    oassert (ceil((log(number+1))/log(2)) <= constant_bit_size);
    new_node->types.number.binary_size = constant_bit_size;

    new_node->types.number.binary_string = convert_long_long_to_bit_string(number, new_node->types.number.binary_size);
    if (flag == 1)
        twos_complement(new_node->types.number.binary_string);

    return new_node;
}
예제 #4
0
파일: main.cpp 프로젝트: WhiZTiM/coliru
int
main() {
    std::cout << static_cast<std::bitset<4>>(twos_complement(bits<4>{13})) << '\n';
}