void solve_problem()
{
	int v[MAX_ELEMS];
	int n, m;
	int winner;
	int msb, nsb, tmp;
	int i, j;

	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &v[i]);

	m = 1 << n;
	for (i = 0; i < m; i++)
		nodes[i] = -1;
	for (i = 0; i < n; i++)
		nodes[1 << i] = 1;

	for (i = 1; i < m; i++)
		if (nodes[i] < 0) {
			msb = get_msb(i);
			j = i & ~(1 << msb);
			if (nodes[j] == 1) {
				nsb = get_msb(j);
				if (v[msb] > v[nsb])
					nodes[i] = 1;
			}
		}

	for (i = 0; i < m; i++)
		if (nodes[i] < 0) {
			msb = 0;
			winner = 0;
			for (tmp = i; tmp > 0; tmp >>= 1) {
				if (tmp & 1) {
					j = i & ~(1 << msb);
					if (nodes[j] == 1) {
						winner = 1;
						break;
					}
				}
				msb++;
			}
			nodes[i] = winner ^ 1;
		}
Beispiel #2
0
void BigInteger::print(int n, char* output) const {
    // one more for sign and one more for null
    int i = get_msb();
    if (n < i + 2)
        throw "output array is too small";
    if (sign)
        output[0] = '+';
    else
        output[0] = '-';
    int j = 1;
    while (i > 0)
        output[j++] = data[--i];
    output[j] = '\0';
}
int saturating_add(int x, int y){

        int sum = x + y;
        
        // grab the most significant bit for each of our variables 
        int xmsb = get_msb(x);
        int ymsb = get_msb(y);
        int summsb = get_msb(sum);

        //logic to find out what type of overflow do we have if we have overflow
        int positiveflow = ~xmsb & ~ymsb & summsb;
        int negativeflow  = xmsb & ymsb & ~summsb;
        
        //variable needed for our return statement 
        int overflow = positiveflow | negativeflow;

        //the variable we will be returning.
        int newsum = (positiveflow & INT_MAX) | (negativeflow & INT_MIN | sum & ~overflow);

        printf("%d\n",newsum );

        return newsum;
}
Beispiel #4
0
void write_mbc2(const uint16_t address, const uint8_t value, Cart* const cart)
{
	if (address > 0x3FFF)
		return;

	const auto addr_bit = test_bit(0, get_msb(address));
	if (address >= 0x2000 && addr_bit) {
		const uint8_t new_val = value & 0x0F;
		if (cart->mbc2.rom_bank_num != new_val) {
			cart->mbc2.rom_bank_num = new_val;
			const auto mask = g_cart_info.rom_banks() - 1;
			const auto bank_num = cart->mbc2.rom_bank_num & mask;
			cart->rom_bank_offset = bank_num < 0x02 ? 0x00 : (0x4000 * (bank_num - 1));
		}
	} else if (address <= 0x1FFF && !addr_bit) {
		const auto new_val = value&0x0F;
		if (new_val == 0x0A && !cart->ram_enabled)
			enable_ram(cart);
		else if (new_val != 0x0A && cart->ram_enabled)
			disable_ram(cart);
	}
}
Beispiel #5
0
R_API bool r_id_storage_set(RIDStorage* storage, void* data, ut32 id) {
	ut32 n;
	if (!storage || !storage->pool || (id >= storage->pool->next_id)) {
		return false;
	}
	n = get_msb (id + 1);
	if (n > ((storage->size / 2) + (storage->size / 4))) {
		if ((n * 2) < storage->pool->last_id) {
			if (!id_storage_reallocate (storage, n * 2)) {
				return false;
			}
		} else if (n != (storage->pool->last_id)) {
			if (!id_storage_reallocate (storage, storage->pool->last_id)) {
				return false;
			}
		}
	}
	storage->data[id] = data;
	if (id > storage->top_id) {
		storage->top_id = id;
	}
	return true;
}
Beispiel #6
0
// Calculate the square error of all filter settings.  Result:
// res[0][0]   : unfiltered
// res[0][1-3] : strength=1,2,4, no signals
// (Only for luma:)
// res[1][0]   : (bit count, fb size = 128)
// res[1][1-3] : strength=1,2,4, fb size = 128
// res[1][4]   : unfiltered, including skip
// res[1][5-7] : strength=1,2,4, including skip, fb_size = 128
// res[2][0]   : (bit count, fb size = 64)
// res[2][1-3] : strength=1,2,4, fb size = 64
// res[3][0]   : (bit count, fb size = 32)
// res[3][1-3] : strength=1,2,4, fb size = 32
static int clpf_rdo(int y, int x, const YV12_BUFFER_CONFIG *rec,
                    const YV12_BUFFER_CONFIG *org, const AV1_COMMON *cm,
                    unsigned int block_size, unsigned int fb_size_log2, int w,
                    int h, int64_t res[4][8], int plane) {
  int c, m, n, filtered = 0;
  int sum[8];
  const int subx = plane != AOM_PLANE_Y && rec->subsampling_x;
  const int suby = plane != AOM_PLANE_Y && rec->subsampling_y;
  int bslog = get_msb(block_size);
  uint8_t *rec_buffer =
      plane != AOM_PLANE_Y
          ? (plane == AOM_PLANE_U ? rec->u_buffer : rec->v_buffer)
          : rec->y_buffer;
  uint8_t *org_buffer =
      plane != AOM_PLANE_Y
          ? (plane == AOM_PLANE_U ? org->u_buffer : org->v_buffer)
          : org->y_buffer;
  int rec_width = plane != AOM_PLANE_Y ? rec->uv_crop_width : rec->y_crop_width;
  int rec_height =
      plane != AOM_PLANE_Y ? rec->uv_crop_height : rec->y_crop_height;
  int rec_stride = plane != AOM_PLANE_Y ? rec->uv_stride : rec->y_stride;
  int org_stride = plane != AOM_PLANE_Y ? org->uv_stride : org->y_stride;
  sum[0] = sum[1] = sum[2] = sum[3] = sum[4] = sum[5] = sum[6] = sum[7] = 0;
  if (plane == AOM_PLANE_Y &&
      fb_size_log2 > (unsigned int)get_msb(MAX_FB_SIZE) - 3) {
    int w1, h1, w2, h2, i, sum1, sum2, sum3, oldfiltered;

    filtered = fb_size_log2-- == MAX_FB_SIZE_LOG2;
    w1 = AOMMIN(1 << (fb_size_log2 - bslog), w);
    h1 = AOMMIN(1 << (fb_size_log2 - bslog), h);
    w2 = AOMMIN(w - (1 << (fb_size_log2 - bslog)), w >> 1);
    h2 = AOMMIN(h - (1 << (fb_size_log2 - bslog)), h >> 1);
    i = get_msb(MAX_FB_SIZE) - fb_size_log2;
    sum1 = (int)res[i][1];
    sum2 = (int)res[i][2];
    sum3 = (int)res[i][3];
    oldfiltered = (int)res[i][0];
    res[i][0] = 0;

    filtered |= clpf_rdo(y, x, rec, org, cm, block_size, fb_size_log2, w1, h1,
                         res, plane);
    if (1 << (fb_size_log2 - bslog) < w)
      filtered |= clpf_rdo(y, x + (1 << fb_size_log2), rec, org, cm, block_size,
                           fb_size_log2, w2, h1, res, plane);
    if (1 << (fb_size_log2 - bslog) < h) {
      filtered |= clpf_rdo(y + (1 << fb_size_log2), x, rec, org, cm, block_size,
                           fb_size_log2, w1, h2, res, plane);
      filtered |=
          clpf_rdo(y + (1 << fb_size_log2), x + (1 << fb_size_log2), rec, org,
                   cm, block_size, fb_size_log2, w2, h2, res, plane);
    }

    // Correct sums for unfiltered blocks
    res[i][1] = AOMMIN(sum1 + res[i][0], res[i][1]);
    res[i][2] = AOMMIN(sum2 + res[i][0], res[i][2]);
    res[i][3] = AOMMIN(sum3 + res[i][0], res[i][3]);
    if (i == 1) {
      res[i][5] = AOMMIN(sum1 + res[i][4], res[i][5]);
      res[i][6] = AOMMIN(sum2 + res[i][4], res[i][6]);
      res[i][7] = AOMMIN(sum3 + res[i][4], res[i][7]);
    }

    res[i][0] = oldfiltered + filtered;  // Number of signal bits

    return filtered;
  }