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; } }
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; }
/*--------------------------------------------------------------------------------------------- * (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; }
int main() { std::cout << static_cast<std::bitset<4>>(twos_complement(bits<4>{13})) << '\n'; }