1010001001110100100000010000111010111101110100101000111001011010001011110101111110101110111010111011000001110100010001001001110011001010111101011001111100101011010011001101011110001010111011110010101001011001010000000000000111111111111000110011111011001111000110110111001000011011111111101010010011101010001000010111001101011000110111100100001011101111100100001101011000100000010110010111101100001011 0000010010011100011111111011110011111111100011010101010110100011000000001111011100111101001100010110101100010110111011010101100000101011000100010000100100100111000001011010101010111000001111011100110111001101110000010111001110010011010010110001110111000011111111111110110000011111010101011011110100110101101000011100110110000101100101110011110111100110110111010111011011101000010001110011011000101101 1011100011100010111111011001010110101010110001000101010011001001001111000010110000110110101100010111111000101111011110100111101110010110001101111000000011000111010000110001011001110001100000000010010011100010101011011010010100100011011011110100101011110001000111110101001111000101000101110110010010010011010110000011101100010101000110010110101001010000100111001010110011111110101001001111110110111110 1010101100000110000000011000001010111001110111100001101001111011110001001000010110000001111000101001010100010011010111001100101110000001000010101011101010010001000010100100001110111111011100000001111010011111000010100000101110000010011000111101100111110010100111111110001100001111001110111001011001000001000110100000001000011101111010011111000101110110110111100011101110101011000111100001010110110011 0001000101011011000101111011101110001001100000100110010010000000101011010011001101111001001111111111111001101001100100011110110011100000001010101001011011101001110000111110101111101001110010010010100110110100001100110010000011100110100111000111110010011100010010010110001011110010010101101001101010101111110000111110100010010110101000001000111101000000001101101100111011101101100100101110100010010100 1010001001110110101101110101110000100110011000101001100010010000101100010111010101010100110100001011011000111110001100010000001101100110101101011011010000011111111000100011110110100001101001101100010000100110101000111011010101110010110111101000010110111110110100010001100001110011111100100101110010011000100000110110100011001100011110011100110110011011100011101000100100010001100100010001100111001100 0011000001000011100010000000010111011100000000100111011101010110001000111000010110011111111110110100001011000101100110010110100111000101001100110100110100011000011000101010100010000101001110000011011110011011101111100111001011000110110001100011010111001100000010001100110001010010100011010011101101000000101000100010001010101101010001100100101110100110010111000101111001101000101011000010101110010010 1111000001110111000100110010001000110010001110010110001000011001100110000010011000100001000101000110100011111101101110111010001111001101000110101110100000110010110101111001010100101101110111101100000010001010100010010001011011011110101110101010100110000110011101100010010101110001011000111100010110010010110010001010010100100001010011001110111110010010110100010010101110100001100001011011000111111011 1111100101110000001101000100011100011110111000001101000001000011111001000011011111100111010000011111110100101011111001011100000000101110001101101011000111100001111000011010100101111110001101111000000001001111111100010011101111011101001010100110001111101111101100000001011111100000000010111101001101111110101110000010010110100001001011010010100101011111011101000101010001011011000001001101001100011000 0101011001011001100011001000001000111100111000011101001100110111010000001100111101110101100010100110001000101001011111101101101101111010000001011100111011001111000011011001111000010011101010001010001011101111010110001111100110111010110001000100010011000000111101010011000001010010100010001011000000000011000100101011011111111101001010010111101101111011100111110111100000111010101110101001011001000101 1101100111110001010000000000010010111011110110100001001001011010011010001110110000001100111001111001111000101010100011001100010000000101011010100110000000111101010011011011100111000011010111011100110001011100111011000010000001111001010110011111111010111001001000100010011101010001100010110010010100011010011001001001000001110011000101000110011101110111001010110100011100001001100000010111111011101001 1101110001000110111111111001000000100100011011010010110000001010100100100110011011010100010111000001100001101000001011111000101101100001010101111001111001001011011111100110011001100111010011101110110111011000111011011100010101101100011001000101011011000001101100000011111110000111111110001101111001001110011101001010111100011111111000001101010010101000011110001011111101100001101000110001110111000100 1011111101100110100110101101011101001010101001101100010100101010000011000101011100000010101011010101110011010110111111010011111101100001100010001111010101011100010100111011001110110111111001100000111000111001001110110010100111101001110011001100000111001110010100010010111101100001101001101000111111010100010100001101111110000011000001000110101000001111110001011010010011001001001000101110101001000011 1100110010001111001011000011111111000101000001001000010000011000101000011011001001101101110011100101001100000100000110111111111010001000000101110000011000001000001011101101100000111110000001000010000100000101100110110010011100010010011100110000010101011001111011101100001100010001001110010011010111100001010010111111000100010101000100000100100101101011000110000010011011010011000000110110110001010011 1001110001011010101110000010101101010101011011010000110101111111000110111010010110111110110001100101100100000001010101111110100001001110110001110000100011011110101111001110001011001111000001100100100000010100001101110010110101010101001101010100000000111101010001011010000100111100000001100010111010001000011000101010000011011000111000111010101110111010011101010011010000110000000011010110001011111011 0011100011111101011110011101010001000101111000000011001011101110011000010101111111111110010010011001001111000000001010101110101001000110111010110100111000111010111011000011100000011000101010100110010000110011101100000000010111000010000100111000000010100010111110011110100001110100010111111100111010000100001101001001101111011110010110110101111001101100010010010111100100100000000100000100110111110011 0010101101011110010100011000001011011011100000001110000111000001111000010000001001110111111000010011000111110100001001010001111000011100011101100110010001010111000100100110000100011110000110000011010011000010011010101100001011000001000010111011000100110010010101010011000000100101100111110000011000001101111100110010111011101111111110101000010011010011001111011110000010010011110100110111011101000010 0100011001000011010011110111010101011001000010011111100001101100000001010011001010010101101100111010001011101101000011000101010010011011101010111111101101101100101101100001001001111101001101111000101100001110110111100101101101001110110010110011110010001100010100011011111111011111111100101111111011011011101110110100100100101001100011000010111011001110101011111001110000111110110111011001010000001001 0100001100111101111001000101010101000001111011100001010010110111111100110011000010000101110010111111100110100001101010101110011010011010010100101100000011000101100001001100001101100110100011001110010101011110011100010001101101101000001101100101110111010101101111110100010100101110011010001010101111111110010011000011001011010100100000001001010101000110111101111111011111100110010100001111011101010110 0100000011111001010100100100010111110011001010011111100011011000001001111010100011000101100000001111010111011111110001010110001010101000011010100110100111001101100011011000011010010000100100001000110010000010000000100111000001100010111011101011000111101111011111010100010110111011001001001010010110101000001101001010100000001111110101000000001001000101001100001101101101010011111110100100001000101100 0110010011111100100101100101011001010001011101111101110110011100000011111000110010100111011001000000010111001100100101010110000110001011110010011000110000101011010100110010010100100101110111100001001000011100001001110110000000100000011101110011100011010011101001001101001011010010100111010001010000100110100001111111011111101001110111111100001011001100011011101111001001101101001011010111011110111011 1101100110000011000010111101000011111011010101111011011101001101101111100111100011011110000100101000011101011101001100110110000100000000001011001111010010001100010110101110111111111011010000111110111111010110010011010101100001101011111110111100101011000111000111000010110111111110100100100100111100101100101001010001011100010101111101000100111000111000000111010101101110000001011101111000000101110111 0010101100011001011011010011111001000001100000101110011110011000111110010100000111001011001011000001111100101110111010101111010110011000110111110111110100100000010101110010100111010011000111010011110011101101000100011100001011010100100100011111111011101000111111101100100011101110101100111101111000110101101101001001101110011100001000100001001111101011010100111100101111101110101010010010001010111000 1011001101111001000010110110110001110110000101111010001011100111110010110010111111111100010100101011100011101011010100000111110001001111110101011100000000010010000000010010000111111111010110101001111101100001110110101011110010101101100110010100000100100110100110100010010000111100110110000001110000010011010101001100100010000010111100110001001000010111001011011010110101011100010000100111011011011000 0111101111111001101111110111010001001101111101001111110100001100011100111101000001000111001100001000100000011111000110111011100000001011101111110110011111110010110110110100111100110110010011000100011001000000011100011011001011111110111100111011111110010011000001000010110011010100101100000111111000100001101110010000111101110011100101001010111010100010000111011001010100100000010011100010100011101110 1011011100100010000111001010001111001011100001100101110111010011001001110001101010010110011111000010110000111100011010001111111001000000001111000100111011110010001000100000000101011100111010010001000010011101000101010110011000010001010111111010101101011110101100100101111110010010010011100110110001111001110110011001000101001000111001001011011000000100011100111100101110001110110011001010100000110100 0111101001001001011011011110100100100101010101011000101000111000010000000010011101110111000100100011111010101100100101100010000111010010011111100111101111000011000001001011101001100011110101111011111110000010100011101101110110111100000101110000010110101011100101010001111111011101101011011110101111110011001101000000000010001101000000110011010101110101001000100110101110010111100111101101011101101010 0001010101001001100110111001111100010011011110110001011011011001001100011010001000100011110010111010111100001111110110110110110111111000010010011100101001011001001011111111110011111010001010110001100000111000001110100110110111110100001111001101101100101101110100001101101001111110100001001010001001001010100000010110101101010011010110111110100100100011010101011011011101110001001010011000101100000110 0000000011110000110001100000011001100100101101000111110011000101110011010111100110001011101010011000001010000100110001101100001101000011110110110010111001111111111111000111001000011011010011110010101111010111100000011111000101001110111100110010001101101000101000011000110100010000001011011001011101011100000110000011100000110000001010001101100110001110110101011100011011110111010111101101111100000101 0100110011000111100111010110100010001111011101101111001111100011010101011011100100000100100001001000101011011001010101000100010101110100110101111111000100001011101101101100111010000011001101111100001001101000011101010000100111000100111101110111111000110101110100101001001100010111111011010010001100100000110001000001000100000100100010010101000101100110110000111001001010111011010011110111000011000010 1001100010101011001110000011100000111100001111011100101000100111100010100100000101110100011011011010000110110000000010001001001111011100110100101010110101011101010111000100101001111100001011110101101001001101011010010100000110010111000001110010001001111000000110101111010101100110011001011000111000111010101110010110010001010111000010011100001100000101010001101011011001111110011110000100100111010110 1001000001100110000100111000010101101110110101001101111010010110101010001000100000011010100110011000011010111001111101001010011111001110100010001011100111111001100101110100011011001000111100100111101101110101011101110010110011000000001011010011010111011010010100000111010000010011100010100101100100000010100000101011111110111001001001110001100000001100010110101110001001010100100100101101101110010010 0000001011111000000000101111101100001010011010111100110010110110001110011001101001111100101010100000000100000000100101110010100000000011111001001100110011010110010011110111000000011100100000101010110000011111111110100110110010000100000000011001001010000001101101001001011101110111010100011111110001001111011011011110000111001000001000100100110110001011000001000100001100011110010110101110011001000110 1000000010111100011101110000001010111001010001000001000110010100011011011000000110101101110111110111010011110111100010010011011011011101011111001111010011101101101000011000010000100000010001100101110001100011000011001101001101101011010001011010000110010101110101110010011010011000111101000111000001001001100001100011001010110111010011110011101100111110101001011100011001111000000110110101011001101110 0110010100110001011000011111110000011010010111111001110011110100110011100010110010011111100001010010101110010011011111010000010100000010101111011100011010010011101010000000100001101101000010100000001011101011011110111010101011000000000101001111110100010000010111100000111010110111100010110000110100010010111100100110100001111011000101100100010011011011011000000011101101000111110100011000010110000101 1011000101100111110101001000101110001101010001001100110001110110101011111110111101000100101110000000110000011001000101011000011011100001111100010110101000000100110110111110010111111011001001011010100110101111101010010010000110000010000101111101000101101111111010010011110111100110111000010100010011010110110011011000010010101000010101001100110111100100101000000111101100110101110010000110001110011101 1011110001101011011011000001111110010100011100100000000101010001011010110111001010000100100010100011110010000011010001011011101101011111100101110100010000000111101100000110001101111000001100110010001110111001001010000101101110001111001110011100110110010101101100001111100011111110110010100100101110001100001100000001010110100111101100010100001110110111010001101000111110111011011011010100101110010100 1010010111101001011110000101010010011101001001100000001100101010110010100011000110101110101111011000010100111011000100100011000001111001110110000010100111110001001000000101010101101010010010010111111011000010011111110000001110111101010000001000001110111010100101110011010001111111011110100010001000110110000110100100110010000000001000000011110100011010111010110111010100010001101111111101001100111100 0111111101111001011011101110101100010010110010101011111010001011010001010011000100101011111110101011001001011101101110001000011010111001011111101001000010111010000101001100100001100100000110110100000101111101110001010110101010000111111010111110000001000000001111011010100011011111001111001010011010000011101001110011010001001111000101101010101110001100110111101010001110110011001010110000010101101100 0101011001110001111011011010000110111110010011110000001101110010000110001111011110010101000110110001100100010010111100001101001110000111111011111011001001001100001110110011000101101001000100101011011101010110001000101010110100100110111101010000101000001000010110100101111111011011101010001110001110010110010110111110100010011110101110001000010001000101111110100111111100011000010000110000011110011111 0000000001010101010101001111001101111010110101011011111101101110100111000101100101011010101000011011110010010110101010111110001010000100010011011010010011101111111101101101110011111000011001010001110011011110001100001001011111000110011110100001111110000100100100100110000111011101100111111111000011000100101011011010111010010101001010110000100101010100100010111101011100001010101000011110111011111011 1000010111110010110101101010100010010111101011000000100111100010010010111011110110110010011110000101101010100000110100110101111000110001110100010011010111000001111100110111111111110100000000001111001001110001100101001000000110010101111010000010100110001110001111000101101011111101111110111001001001010101011011001000001111110111101111100011001110000010110011001011000100000000101111001100111110101010 1100101011011000011001100111000111111111111110000000011110001011000000110011001000111000000001110100000100101101011010001111001100101111011110011000001101011000001000100111100000110000111001001101011101100101110000010000011100100011111001001011000000100011110100111000111001001001010000011111111101011001001010101011111101000001111111000110111000110011011111001011111000110000111100100101000100110110 0101110000011110010011110100000101010000101000111001010000011100111101100000101010101000110011110101100111011110111101010110000111011010110111000001101011011101000011101110100001100111000010010101001001001011111001011010111110100011010001011011000011110011010100101101111000111111000000001001011011001110100001011111110011110000001110011001111110101110100010100000101010000001100100000100000000000110 0000011001011110011000100111110111000010110110010111001001111110111000011101011100111011101101000110110111111110001100011000010001100000010110000100000011101011011000100111010110100010011000100000100010101110110000010101100111001100010010101111011011011010010100101010000010010100010000111100000111101001001000010000101000111000100000011011011010111111001010100101000001001101100110101111100001110000 0111001101110011001010010100011001110001111110101100001111101000001000011001000111000010000100010001010001101010011111000000010000111001001101110011000111010101000111000110100100101101010010010110001110111011000000110100010100000001111100011010110000100000111011000010011011111000101000111011001011100001010100100011010100010000000100000101100110000000001011001000111000000101000000011111111011101110 1111111100000100111010011010000101100001100101110000001010111100101100000010010101011010100110101111010110000110010101010101100011010010111011110110101110001000001100001110000010101110110100001111110111011011101101110101110000010010101011101010000011001000001110101100101000110101101100100101010001111000001000011111100010111111010010111001000000000001010000100011001011000011100110100110110011000010 1100001011011000001101100100111001101010011101011011110000001100101001110101100010101100001101000111111101101000110001001010000001111110001001110100110000010000000001001010100011111100010101011100110111101001011010011011100011110001000010001110110000000110110010010001011000110011101110011011110001001011011000010011110111111100110010100111101101011011100100100001110100010101010111100101010001111011 0010001000111010000011101101110011011000101100001000000101100010101011000111011000011010101000010100111101100010000111101001110100010011111110011010010100100011010010000001111101100101110101010111111001111111111011110111100010010100000100001101000000010110011000001110110001011010001011010101100010100111101110110110000010101111110101001100101010100101101110011101010010111000001110011000100100010101 1101110110110010000001010111111011000111100100000000011011001101001110000011000001111001111000101101100111000110010100011101000100001101100000010011001000001110011111001100111110001011100010111110000111011011101110101010001001010010110100000011010101011011110011010011111010100111101001001100100010100000001010100101110001101010001101110111111111000001101000101010100111110100011100011010000111110110 1110110011011001111110001000000110111001010101110100111100001111101000100001000001101000010001001111101100000111011111001011110111010111100000101110100001100000010000001001111001010100100011001000010101111000110110111100111001100010110010111011000011100001011010111011110011101001000001010000010110101011100001001101001100010001110010000101110001010011110000111111110001011110011010011101101101001011 1010011000100011111010001011011000010000000001111111010011011100011111100101010010110111010011110001011010101010100010111001001110001011101100000111111001110001100110001101110111010001010110100111010010100100000100000001001101100011101101101110000010100111011111101010010010110000011111101011101000001110000111111111111000111111000100110111011110000000011111001001001110000111011011101100111010000110 0011001100101000011010110010000100110011111000100100001101110011000111011111011001110011010101101100000000101011110011001100001100011110010000000101110110000000000011101010110010001110110111000100011110001101100011011010000100100101110110111100000100010001110011101011011101111000000101001111101110110101010010101000101110001000100001110111101011010001110001111110000010011110010111100111111101101110 1011100111101011011010001100111001110111111000001010101100011101100001101011100011011110011101111001101011111100111110101100001110101001001000110000010011100100100000110001000001111101110110110000010011111001100100000111110011010011001011000110111001111011100110010001111101111001000101100111110101001100110010000110001111011101110100000011110111011011111010100101111010100111110000111001010111111010 0011010100010101011000010110010101111110100100111100011111011111111101111110111011101010000110001011111001100011111010001000110001110111010111101100101000111010111101001001000110111000100100110010001100111100011011100110110010000011111000010001111010011000010011010100000100010111011010101010110110000011111001111000110010110111110101110111010100000000000010011100100111100110110111110010100111101010 1101001101000001000101010001100000001001100010101101011100010101000010111101011000001110010111011110001011000001111110011011101011011011000110111111111101001110101101101110011011111010000110111000001101101111111110100011111100000100101010100100100001010011100101110000001010111010001010101011000101011101011100000010001101100010110011100010010101100100011100011011010101010001101001000111101010001001 0010111010011100000100111000110100100110000010011000001101010101101110010101111111110001101010001000111001011000000011010010111010100011100110011110110001101110101000010101101000010010000001101110110010110010000000010101010110000011000101111111010010100011000000110010001100111111011100111000110010011110111000100001110100100010000001001100010111011010010110011011100010000000001100100001000101110011 1001000110110100001100101110110110011100010001010101001011001101110111100001010110000001111110111000110011011101011010001100111010010001001000111101110011110000001010011001100001111011100011111110011011010111100000101100001110110010100000000111001111111100000110100110001011110111111010110111001011010100101000111110100111100101000000000010111101010110000011100011010101100101000001111000010111111100 1100100001100110010000011000000110100010011001000110101100010011001001110111110101110010100001111101101101001101000001000111000000110101110000010001100010001010001100010011001111001101001000110011110011000111100100000010010111000101110001011000000110100110110000101111011111010100110111000101010110101000001100001100101010000000100011111010101101110110000111111010100100100001000101001011000010100111 1100111100100110100010111010000000101100111111111010100010001001001101100000000110001101001101011100111000111000011100010000000100100001101110111000011010001100011011101011010111011010101111011101101010111110110000000110100100010110110010011111100011111111011010100100100000100011000000100101011110000101101111011010100010110110011011010110110011100010100111000100010100110110101000101100100010101000 0000010111011010111010001111110010011011111110111001111010110101111011110000011100010010100000001000000001111001111110011010110011110000011000111001011101100110100001111100010111011111010011110001101101001110100110011111100000010010100111110010110101100100000011001000101011101000010011110001111011001101011001111111001100111110110110011101001101110110110100010010110100111111100100101110000010001100 0001101110101000110111010110010010010111011111001011011011111010000000000111010111100110101000101100101111101110010101001110010110110010010111110000000111000110010000001010000100100100010110011010111010001101000100001111101110101011010110100001000011111011101110000011000110100010001101001111101110001011011011101111001111001011001110100110100000101100010111011000011011100011011001101010101110000101 1111111100010110011010001001001000110111011100010100000011100010110000011100001011011010101010111010100011111111110100101011101001110011110111111000010101101111111011001111111101000000110011110001010110101001000101101111100101001001010010010110101100100111011000010110000000001001100101011111010010001010100000100100001000100101000110011000010110000110100000100110111001001111000010010000100111100010 0111001001100011110010100000100010101001010100101101011011000111011000111111000001000110110001001111111111110111000110110100111000011011000001100011010000110001000011000111011000101100001111111001001000110100101001110100110111010000011011110001111111001011000101001101011110101100000001100101110000111010011010001111101110000111100111001011111100100110000110110001100011100100001011011000011001111001 0101101001101010111001101111010110000011110010010000101111010011101010011000100101110000011101110001010110010111000010011001001111100000011110100010111110000010011101011101111101101011101111001010110110010011011100111100110010111011101011001000111110111101111011111111100010101001001101110101110001011010011011011000011000010100110101100111101101011001111010111010101101010011100001011011110000110011 1110011001110000100101011011111101110100000001100101110111101011101010010111101110111101110001101101111101010101100001000011001011101001001111101001110010000101110100001101110111010100011111011110101010000011001010001001111001110111101101110110101100011100010001111101010101000111000010000110000101101110100110011101001100100110101111011011010110111000001000110110111101010111100100000000010101101011 1110000100101111110111010001010110101111010010110111000010000001011100100101010010111100001011110100010110110111001110110000000100010110101011100011001011100010111000010100011001010000010110111000001001010001010000011101101110110101111001101110010011111111000110100001010110011011100110100101010101000100000001101100011000100101111100110111011100111111010000011001101100110000000010101001101100101100 0001111111100010011001101110101100100101010001111101010010100111011010110101100010101100110110010010100111011001111001001001100010001010000101100101001100110010111110100111000110100101110101111010001011111110001110010000000011100011101100010110101010100100101100111101010111010011001111001010100100010100110010100000100111100010110011110101101010101010011010111001011100000110100111001001110101101010 0111110100100000111111001100000010011001101101100000100110000011111100101111011010001100111101111011011110111111010110111110000000010011110101101101001110000101110110011100000101000011001011000011110110000010011100010010010011110010010011111010011111100101001011111001000100100011011101000111100101011010100011000000001100011001010000011100111110110000100010011011101101110110001100101000101010010011 0111000001110010111011110010100101000100100100101011000111010011010110110100001010010000000101010110000111011010000011010111001101000010000011110100101100110001101001110100101100100001100011010011000110011011101011011010110101011110000010100001100111111000111101110111111000011110001110001011110010101010010111100001001101111110001101111101010010000101110110101010010101000010000111110000011011000010 0110110111001111000110100000010000111101110001111110000010001010001101110101111101110011101010111011101011110010011100111110101101100000111111000010000010011111100010101001001000010001111000110010010000101110101001111110000001011110110000010010010100100110111000101001101011101100011100001111100010011010101011001010100000001100111010101001000110001011010010010101001100111101000010011101101000000011 0111101010110111101100010100110011001101111100101111000001100011010010101111010001001011110100100111001000001111110100110010101110100110110100010011001001100001111011001011110101000010110000100101001010100001100110111101000011100100000111010010011001000111011101111010111011110001101011100100011001010010101000111001100100011000100101100111111011100001000010110001111000000111100111011100000101010010 0000001111011011001001010101111000110100101000100011010001011011100110010101001110111010010000011011101000011000100010101000101000000111111100011101111110101000001100100001010100011001001101001110010001001011001010111100110111001111011111000101001100011011001101010101010101101111010010010011111100000111010101110100101001011000101001011101010111111010010101001011101111011101111100111100110101101100 0011100110110101100000010111011101000011111000010001010100010110100110001111000111010101011011010100111111101100010110100001110000111001000100000100010110000110100100111001011110111111000001011100111010100000110011110001001000101100011000111000000011001111010100111100110101000011000111110100001010010100010110001010110001111011000100000101111110001000100001011110100101110110010010100011011101001101 0001000001101011000001111110110110010110111101100001100110000100001111111011101100111101110100110111010100110110111101001101010111111010010000001110010001100101110010000011101100010101001111001000100001001000010110010110010001111000001011100011000000011111010110101101101100010100010011001000011011101011000010000100100001100010100000010000100100001000110111011000101100010110110011010101000101100100 0011111110111011001111101110011000100101100100010101110101100001110011011000010010001101000100101000010100101001101001001011011000010111110000110000011001101110100100010010001001011101011000011100001111000101001010011111001100001101100011000100100111001111111000101011000110011011011001101010111111101000110111110000011000111110110010101111111111001010010001010001110011011111100100000101010100111110 1111011010001110100010110110011101111100001111011100111101110101111111111101101101110100001100110010101101011000010100101100011111010001011001101011001100011011000111011010000011001011111110001001011010101100000010110010011111101110000110010100111001100011101111111111100111010111100111000001011010000001110111101110100101010101100100110110101000011000110001111011011001110000011001000000101101110001 1001110110000011101101010111101001001000100111001011001000111010011111110111010110001011100001101100000001000111011110100001010101100000000111010010110101011010011101111000100110111000111101010011010111100111110111110001100000011110000110101001001001010101000000001010010101101110101010000100110101001010101001001101000110101011101100000100110111010101100010111101111010101001100001011001000001111001 1011010101101011100110111111001011000100000000000101000010011010001011010011111001000011111001111101010101011100101100101100100111110110100110011101100010110101000011100011001100101000111110101000110000011101010000011011000111001100011110011011101111001110110110111000001001011100110011110010101100110011101100111100011100110000000000110011101010001001111100110110100010101001001000010011101010001101 1010000111111011101101001011100100111001110110011110000010111100100010111011001001111000010110010011110111001000011111001011000010111011100001100000000001111010100010111101100101101101100100010101101011010001010011110011101001111010101111100101000101111001010101010101001111101100101000011110001000110100000101110100101001111101111010001011101001110101011011101000101110101110101111001001110110011010 1101000011111100000000000001010010110101111101000001100001010100011111100111110010001011110001000000110000100010010000111001010001100100010010010110001011101010011001011001100111011010110110000001101001011100100100001010100110100101111010100000100001010111111001000100110011000100000010001100111111011000100000111111100101111001010001010010000101011010010110001001010100000111101101101111010010111110 1111110000011100111111111000111100101110010001111000100001111010100111111011001100011001010101001011111101010111100100100010111110001010011000101011011000001001100010100100010111110010111111010000011000000011010001011101111100011011100111000001001100001000100010110100100111001000111000001100101000001000101110111011100001001011001001000010001010010010011111001001000100110010010110011000011010000100 1010101000010111000010000101110110100100101100010001010111111001010101101001100000101111101101100100000100100101110101001001010000100001011111110011100110001100000000011010110000000110010110101111010101010011010100011110010101101101101000011000100100000011001001000100111110100001100001101110110010100110000111001100111000010000110111111011101000011001001000110111100101010001001000101010011011111110 0101101110100101001000001100001100010110110010011110100110100010000001000100100100101010001101100010001100011100010110100110001010101110101001010111010011000110101111110001010111001000110010101011110010111100011111001001100101000011100100000011101110010001011101110010111011001001001111000111000101110110100011000001110111110111101001000011000100011001101111111101010010101010100011111000011011001000 0100000111010111010100010111010010001111111001010110001001011010100101000001110100010100111011111000001010101000001001000111111101101100000011110010000101001111000010001100110111101100110010110100001011101110101101011101110100101011110111010110100111111011000001101010011110111010100000001101011000001100100111010000010010001001001110110000110001110010110111101001010010110111010011000111101101001001 1111101001011100001101110000000110011010101000110110011111100111100101000111011111100010001110011110101101101110100001101001011010001000111111000101000000110101001101111101011111100001000111010111001110101101001001100001001111110101011111010010000010010110100101111000010101000010010100000000111011101100001100001101111101010001010110001000111001100111111110111101001001011101001000011111100100100000 0100000101100110111111100110110001000100110000100011100111111000111011001011100110010100100110010111101101111100100000000100100011000011100000101010001101111110110110111010011010110000100001010000010111011011001111111011111100110000001001101010100111111111110101010111010100110001100111000000100110101100000100101101111110011000110110000001010010001111110110110000101000101101101111011110011100100010 1111010100000010010111010011000100110110000110100011000011010010101000111110011001110011110000010110010001101111011000111111111100111111101110011100001011010100101101010110010110101100110000110101101101110011010011010010100100011001101100011111000010001101110101110000111010101001001001110111000010010100011101101111100000110100110000000010101110111001101100101011111001111101111110100110100111000101 1100000111100011000100111100101001111000000000110010110100110001000111011010001010011110011110001100000011111011011111110101000110011001110000001011000011100011010111000000101011000100110110000100011010110110000011110000010111100010010010001100000011011001001000100110111010011000110011101001101011110101010101010110111111011100101010111101101000111100000100101011011010011110100101110011100101011101 0101000010101010001101010011101100111110010110010011010010011001110010010110100101100000010110001010110101011111001011000010111001010000101010000001110001010111001111010010001110001101111111101101110110111100000101101101001101111011001110111000001110000000001100101000001110010010111110001111011000100111010100111011010101111001000011110011001000101111011110010101111101011000010000111011011001111010 1000001101101110111010010000001110001101001010111011111010011010001011010000000010011001110101101111000101010100111011111111010000111011000000110111101111011001011011101010101010000011111110010100100010010101001010101000011101001100101110101111101110100000010111001111000010100010110100000111110001111110010100010011101001101110001100101011111101001011111101111110011011100111101101110110100111111001 1100011001001001110111111100001001000100101100001101100000111101011010001010000001011110100111001011011011100100100011000101011110011011110000100100011111000000111111011010100110001001100000110111100010111111111011011011110100111111000011010101011100110111010111110111111000101011010010100101011001100000001011100000111100111011111111110100100010110111010001100100100100110100000101011110101010110111 1011101111110000111111100110001010100110001011111001010011011101111110010111111101011111010101110110011010001010100110111000100010110101110001001000001100110101111010000111111011111111100011001110001111100011000011100011010111111110011000111110111101011001010001001000110101010010001100111111011010111100000110011010010000101111010010000100101010001110000111101111100000001100001111001011110110011100 1000000011011000010101101101000001110000000000110100000101010101010100110010100011111010111010100010011011100101110100001101111000111111101101001011110101111101110000100011010100101101101010100111001100001000000100000111110110100001010011000001101001101010000111110110000011111011110111001100110000111001001011001110100011101101000000101010010101111010101010001110010110011001011101101111100001111100 0111110101101011011110110010011001100100001101001010001010011110000111000110011001010001001001101001001110100011100111101111000001110101111001101100100011100001011010101000000111001101000000100101110100011111001010110110000011101111001110100001001001101111101110110011100110100000011010011111011101000111001100011001000111100001101011001111011101110010111011000111101001011101000111110010110001111011 0000101011010101100010010111101110100010110111000100010110110111001000101000011001101010011110000011111110101001111001010111000000011010111110010011110000011111011000100010010110011101100000000101000011010110110011001001011011001111110011010010110001111101111010110110110000000110000111111011111011110111111001110101001100101011011111100100011100110100100110111111111000101001001111101001111001111110 1101100101011001010010111010110100010111111010000011100110011001101110010010111011110001000101010011010001001100101101001101100010000111111101100100010000101011011000100000010001110111010000001010111000000111010001110011111110111110010010000100000110111110010101010000100101010010100111110110111011101101110110110011011110001101111001110010011000110000011010100011111011101110000111100011001010000010 0100110101001101100011110101001011100010101111110110001101000000110111010110011000110101010011101000110011111100100001111110010000000000010101000000001011000011011100100110000110001101101100101001011100000000011001010111110111010101110100111110011001110000000101101011101010011000101000110000101110000000100111010011000010110110111101001100111011000111011001000001011010101100111000000100000110100111 0100110001000100001000100010010011111110100111110011001110101110110001100101101001110110010000111110110010101010001100110101001111010111010100010001001011011000011100000100101101001111000000001110011010101011001101010100011000000000111110100010011010011010111111111100110011100011110001111100110110100101001101000111010000110111101101010001010010001010000000000010001100011011111001100100111000110010 1000111010000011000001101111100010000100000000010111101111110001010100000000100110101000011000001101101000000100110101100101010110001100000111111100010101101110001111100000010100001101011000011011100110110011101101011110111100101000011111101001000011110100100001001111100100010110011011011011111000111101010101010110011001010110010110000100101011011010111100110101111000001000010110110000111011100010
C#

【C#】値型と参照型

12/30/2020 1/2/2021

5年以上前の記事です。内容が古くなっている可能性があります。

内部での変数の扱いの違い

似て非なるコード

まず最初に次の2つのプログラムを見てください。

using System;

class Program {
    static void Main(string[] args) {
        Counter c = new Counter(0);
        Console.WriteLine($"before={c.Count}\n");
        PlusOne(c);
        Console.WriteLine($"after={c.Count}\n");
    }
    static void PlusOne(Counter c) { c.Count += 1; }
}
struct Counter {
    public int Count { get; set; }
    public Counter(int initialValue) {
        Count = initialValue;
    }
}

(cAlgoではなくC#のコンソールアプリケーションです。VisualStudio→新規プロジェクト→C#コンソールアプリケーションで適当な名前で新規作成して、このままコピペで動きます)

Counter型のオブジェクトを作って、Counter型を引数にとるメソッドで中身を+1して、最後に結果を表示させているだけの単純なプログラムです。

このコードの結果はこうなります。

before = 0
after = 0

おや、メソッドで+1されたはずなのに0のままですね。なぜでしょうか。

では次をご覧ください。

using System;

class Program {
    static void Main(string[] args) {
        Counter c = new Counter(0);
        Console.WriteLine($"before={c.Count}\n");
        PlusOne(c);
        Console.WriteLine($"after={c.Count}\n");
    }
    static void PlusOne(Counter c) { c.Count += 1; }
}
class Counter {
    public int Count { get; set; }
    public Counter(int initialValue) {
        Count = initialValue;
    }
}

ほぼ同じコードですが、Counterが構造体(struct)ではなくクラスになっています。ぱっと見、同じ動きをしそうに見えるかもしれませんが、結果はこうなります。

before = 0
after  = 1

ちゃんとメソッド内で+1されたものが反映されています。これは何が違うのでしょうか。

 

値型と参照型

この違いが値型と参照型の違いなんです。

 

説明の前に

オブジェクト指向では変数=オブジェクトと考えることが多いですが、この記事では「変数」と「オブジェクト」は概念的に別の意味を持つと思って読んでください。

ここでは「変数」と言ったらCounter cなどと宣言された c を指します。「オブジェクト」と言ったら、どっかのメモリ上に存在する c が表すモノ(値)本体を指します。

この定義であれば「値型」と「参照型」は変数の型の種類ということになります。そして、変数をメソッドの引数に渡すということは一般的に「変数の中身をそのままコピーしてメソッドに渡す」ということ示します。

重要なのでもう一度。引数に渡すということは、その変数の型が値型であろうと参照型であろうと「変数の中身をそのままコピーしてメソッドに渡す」ということなのです。

これを念頭に置いたうえでこの先をどうぞ。

 

構造体Counter型の変数は値型

C#では構造体は値型になります。

値型の変数はオブジェクト本体を自分で持ちます。つまり上記変数c の中身をのぞくとCounter型構造体オブジェクトそのものが入ってるイメージです。オブジェクトを使うときは中身のオブジェクトを直接使います。

引数に渡すときは「変数の中身をそのままコピーして渡す」ので、このCounter型オブジェクト本体をコピーしてメソッドに渡してあげてます。メソッドが使うのはび出し元が用意したオブジェクトのコピー品なのです。

上記一つ目のプログラムではメソッド内で+1されたCounter型オブジェクトはMain内で宣言して最後に内容を表示させたCounter型オブジェクトとは全くの別物なので、メソッド内で+1されようとなにしようと、最後の表示には何ら影響を与えません。

Main内の変数cが指すオブジェクトのプロパティは初期値0で作られて表示されただけなので、当然結果は0のままです。

 

クラスCounter型の変数は参照型

C#ではクラスは参照型になります。

参照型の変数はオブジェクト本体はどっか別の場所に置いておき、その場所情報だけを自分で持ちます。つまり変数cの中身をのぞくと、Counter型クラスオブジェクトが入ってると思いきや、そこにはオブジェクトがある場所だけがメモしてあるだけなんです。オブジェクトを使うときはその場所を「参照」して、その先にあるオブジェクトを使います。

引数に渡すときは「変数の中身をそのままコピーして渡す」ので、このオブジェクト場所のメモをコピーして渡してあげるのです。メソッドはその場所情報を「参照」して、そこにあるオブジェクト、つまり結果的に呼び出しが用意したものと全く同じオブジェクトを使います

であれば、上記2つ目のプログラムではMainでの変数cが指すオブジェクトのプロパティは、初期値0で作られてから、PlusOneメソッド内で+1されて、表示されたということになるため、結果は1になるのです。

 

C#では型の種類により自動的に決まる

C#ではint,doubleなどの組み込みの単純な値と構造体、列挙型は値型文字列(string)やその他クラスはすべて参照型と決まっています。

プログラマが、参照型にするか値型にするかというのを考える必要はありません。その代わり自分の使ってる型がどっちなのかを意識し、挙動を把握したうえでコーディングしていくことが重要となります。

 

 

参照渡し」別の話

「参照渡し」は引数の渡し方を示す言葉

上記は型の種類の話でしたが、似た用語で、メソッドへの引数のを渡し方を表す言葉として「参照渡し」「値渡し」があります。

勘違いしないでいただきたいのですが、「参照型変数を引数に渡すのが参照渡し」ではありません!他の言語でそのような使い方をする人も一部いるようなのでややこしいのですが、少なくともC#では違う意味で使いますので注意してください。

 

C#でいう参照渡し

最初に「メソッドの引数に渡すというのは『変数の中身をそのままコピーしてメソッドに渡す』ということ」と言いました。これがC#を含む多くのプログラミング言語で一般的な引数の渡され方で、引数の「値渡し」と呼ばれます。

これに対し、C#では「参照渡し」という特別な引数の渡し方ができます。「変数自身の参照(場所情報だけ)を渡す」ということができるんです。メソッドの定義時にパラメータにrefキーワードやout,inキーワードをつけることで参照渡しとすることができます。

渡される変数自身が値型か参照型かは関係ありません。何を渡されようとも、その変数の参照で渡すのが参照渡しですので、値型を渡されたら値型の参照を渡しますし、参照型を渡されれば参照型の参照で渡します。

using System;

class Program {
    static void Main(string[] args) {
        int n = 0;
        Console.WriteLine($"before={n}\n");
        // ↓呼び出し時も参照渡しであることを示すrefが必要
        EditParam(ref n); 
        Console.WriteLine($"after={n}\n");
    }
    //-------------------------------------------
    // 引数を参照渡しでもらって編集するメソッド
    static void EditParam(ref int param) { //← ref をつけると参照渡しになる
        // ここでのparamはMainのnを別の名前で持ち込んでると考えていい。
        // こんな風に代入してもnの値も連動して変わる。
        param = 100; 
    }
}

結果はこうなります。

before = 0
after = 100

なにが違うかわかりにくければ、refキーワードを消して動作の違いを確かめてみてください。

参照型の参照とか言われてもわかりにくければ、「参照渡しでは他で宣言された変数をそのまま持ち込むことができる」と考えるとわかりやすいかもしれません。

 

値型の「参照渡し」=参照型の「値渡し」?

違います!実行してみると全く違うのがわかります。

値型の参照渡し

これは値型を参照渡しするコードですが、一番わかりやすい違いは13行目、引数に直接代入処理をしたときの挙動です。

using System;

class Program {
    static void Main(string[] args) {
        Counter c = new Counter(0);
        Console.WriteLine($"before={c.Count}\n");
        EditParam(ref c); 
        Console.WriteLine($"after={c.Count}\n");
    }
    //-------------------------------------------
    // 引数を参照渡しでもらって編集するメソッド
    static void EditParam(ref Counter param) { 
        param = new Counter(100); 
    }
}
struct Counter {
    public int Count { get; set; }
    public Counter(int initialValue) {
        Count = initialValue;
    }
}

結果はこうなります。まぁ実質的に前項と同じコードですからね。

before = 0
after = 100

代入処理をしてもMain側の変数まで連動して変わるというのがポイントです。

 

参照型の値渡し

上のコードの2か所のrefキーワードを消して、structをclassに置き変えるだけで、参照型の「値渡し」になります。

そうすると、結果は当然こうなります。

before = 0
after = 0

むしろ引数に直接別のものを代入した時の挙動としては、こっちのが自然に感じる方が多いのではないでしょうか。

 

挙動の違い

引数に「参照渡し」で渡された場合は、参照型値型にかかわらず、変数自体が共有されます。引数本体が「参照の参照」となるため、引数=変数として扱えるのです。引数に別のものを代入すれば、呼び出し元の変数内のオブジェクトも連動して変わり、引き続き共有されます。

対して、参照型変数が引数に「値渡し」で渡された場合は、引数中身の参照が指し示すオブジェクトのみが共有されます。引数本体はただの「参照のコピー」ですので、引数自体を書き換える代入では、引数側は変わりますが、オブジェクトの共有は切れ、呼び出し元の変数にはなにも影響ありません

値型の参照渡しと参照型の値渡し、字面だけ見ると同じように見えてしまいますが、別物ですので間違いないようにしましょう。

 

「参照渡し」は何に使うのか

どういうときに使うのか、一つ実例を示します。

文字列を数値に変換するメソッドを作りたいと思ったとします。しかし、この処理は失敗することもあり、成功したかどうかを返り値で受け取りたい、しかし変換した結果の数値もなんらかの形で受け取りたいという状況を考えてください。

さてC#ではメソッドの返り値は一つしか受け取れません。どうしましょうか。いくつか手段はありますが、ここでは引数で結果を受け取る方向で考えます。このときに結果を入れるための引数を「参照渡し」で渡しておき、結果を入れてもらうような設計にするのです。

例えばこんな感じ。最後の引数はoutキーワードを付けることで「参照渡し」で受け取るようにしています。(refキーワードでも内部的には同じですが、返り値代わりのように必ずメソッド内で代入する場合はoutキーワードの方がおすすめです。)

bool TryParse(string s, out int result);

あ、もしかしてこんなメソッド見たことありますか?ですよね、もともとある組み込みのメソッドですからね。

参考までにintやdoubleの静的メソッドTryParseはこんな風に使えます。

class Program {
    static void Main(string[] args) {
        string str = Console.ReadLine();
        int n;
        bool res = int.TryParse(str, out n);
        if (res) {
            Console.WriteLine($"入力は整数{n}です。");
        } else {
            Console.WriteLine("入力は整数ではありません。");
        }
    }
}

 参照渡しする変数nは初期化の必要はありませんし、なんなら渡すときに宣言してもかまいません。(outキーワードなら。refキーワードだとこれができません。)

この「参照渡し」自体は自分から積極的に使う必要はないのですが、こんな感じで使われてるメソッドもあるため、使い方くらいは知っておいてもいいかもしれません。

 

 

まとめ

値型と参照型の挙動の違いはしっかり理解しておいた方がいいです。「参照渡し」は仕組みとして一応知っておきましょう。

値型  → 型の種類。値型変数を他で使うときはコピーを渡すので基本的に他のメソッドと共有はできない

参照型 → 型の種類。参照型変数の指すオブジェクト本体は他のメソッドと共有可能

値渡し  → 変数を引数に渡す普通の渡し方。特に意識しなくていい。

参照渡し → 引数に渡すときの特別な渡し方。メソッド内に他で宣言された変数をそのまま持ち込める
       渡される変数が値型か参照型かは関係ない。

あと、繰り返しになりますが単に参照型変数を引数に渡すことを「参照渡し」と呼ぶ人もいるみたいなので、その辺は空気読んでうまく対応しましょう。

 


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2026 ajinori