1111111011110100110000110101110010111100110000100001101010100110011100101010110100110100111011100011001101010011011110011111011101110010000100110010001010001001110011111100011011101001000000110111110011100000111111101001111110110111100011110010101000011111101010111111100101110000011101100011010111000111101001011101100111101000010001010101011010011010010011111001100001100100001000010101111110011000 0001100111110100000010100111111011000110111110010011100010100101001100110100111110101010100111110000011000000000000000111000101101101000100111000101001100000001011001010111010100111011000111010101011000100011111110001101011010100001100100000100011101000100101111100010010101110001000000010110010110100111000011100100110011001110100001100111001111101001001100100010010110110011101001011101101100010110 0111010110101010101101011110000011101000101100010011010010111101101000000001100101111011111000000110011110110000001000001110111001001001100100100101111100000010000001000110001011111000100010010000101100000111011101110110111001101010011011010010111100111001101111001100001011001111110010100001000010001111100001000100000100001010111011010101001000000100001000011011101111011100010111011001111101010101 1001100001011011110001110011000101010110100111110001010110111110011000100001101111000000001000100000010010011101101111101001111100100111110100111101001110001000011010011010110000011000011011111100100100010001101111111001110001000000101110001011101110100010111111100010110101000110011110100111100010100000011001111111100010000111000010001001010101011011100101011000110000001110011010100000101110000100 0001011111111101011111011010100010100011101011110100001011000010110011110010001111011101110111101100111000100100110110100010011101101110110110000000111001011101111011000001101100101011011010110101100001110100111100101101101100001110010100011100110101000001101101011010101101111110110100101110001111000110001101010111010010101111000101100110010100111010010111101101011111100110001011001000010011111101 1010100010010101010000110011101010110001010011011001111001011110001000001111001011100110100111101010011011010110101110011110000000100100101101010010000110010001101011111101110111111011010000010011000111001111001101001000010101100011111100101001001000110001001010101010101010000001010111110110011101000001111111111001110101010001001011011011001011101011000111000111000110100111111101100111010101100110 0111100100001010100100111101101101000011110011000011101100001101001011010010110001101101100000111001011111110110000111010011000100100100100101101110011001000101100001011101011010111010101011111111100000111100101110111111011010110101001011101010111000011001001110011100000001111010111101111000111111101011100011001001110100001111000111111111000111100100000010010000001101110010011111010100011101011100 1001110001010001111100010100101001000001100101100011001101001101101111011111110011010011010100100111000101010110101000001010101010110101101101010001010110010101000000000010011000010111111111010110111000010111000001101111110101000101011000100101000011110110100001011011000001010100001111110101101000000110100000011010000101110101001100100011000000010001000001100000111011011001110011010001011011110100 0001101101011011010110010011100010101001110111000011011011111100101100110110000000100010011011010000111101100001000011000111000101111101111111011010111100001100001110100011000110100100001011001010000100011101000111100000101101000010110110010110010110111011100011011100001000010001010111101100101001110110101000111001110111011100001011101100000000111100000001001100000111001100001000111011100000101011 1011101001110011100100000011000111100000001101101001011010101111100100110010101000100100001110001110111110110101100101011111010011110010101010010010101101101101000111001100010011001001111001100010000001011001001100101100110110111001000111001101001011001000101110001000111100111100100111110010010100100010011101101001000110010100001111001010011110011011001001010111001111010001111100001000010100101000 1101100111011000010011010001010000101101111110010010010001111100001110100101001010100101111111111000111001001001101100000010000010001111101110000010010111110110010000001011101111001100001100010011000110101011011010010010001011110011110001000011110011010110011101000001000110011100000100001100011110001010110101100111010101110101011011010000111000001100000010010010000001001001001010100001000010101011 1011110001111011000110101100011101011001100111000100011111000011010010001011100010001010010100010011111011001111000110100101010001001010101001101011110000111100110001101011001110111011101010100110010111100101001111101111011001001010000011001101100110010111000111110000001111010110001010000000001010100101100011010101100101110101010101010110010001010010110100010110101101101111101010011011101001001000 1000110000111100011111101000011001111011001000111100101010110000100101001101000011101000101010101110001000110000110100110001010100110100011100111001011100001000000101100000101111000000111111110001111001110011100000000110111100010111000000111010011100110101010100101011011001110010110001111010011100010110111100000100100111100100100000011111000001101000000000101010101011000010110101000001100000011100 1111001100001111001011010101010001110011100011100000010101001111011101100101000001011101110010000110010100001101011110111010100000111110000001001011111101110010001001100000001100111010111111001001110001010100110101111010100011101101110100111100000101010111000000000100000001101000000000011011110100101011001011001100010001111101011010000000110110000111101011100100101000010111001010010110000101011101 1000101101100101110011011010111010111001011011000011011101011010011100101110100110111000111011110000100100111010101100001111100111001011111101110010100010111011011101100111010111111101100101101110001110101011011011111101110110010001001001010010111011001100101010101100010111101000100101001100110010100010111100111111001011011100011101000101000001001101010011010100101011100100110110101010101100111100 1011010111101011101010000001000010011111100101010010100011000101011000111100011000111000101100111110100010001110011011000111001101011111001101100001010101111100111100101100011000011001100110110000001110001101011111100011100100010001100010100101011000000111001001100001101001101001011011100100001100100111010000111100111110111010100011110101010110001001101000101100111111011100110011000001100111011000 0100100000011100001011000101000100011101110100110010110110110100000001110101000010101010011110110100101100101000111101011000110111111100100101011011110011100110100110100001001110100001001100110011010101011010111100101110110001110000000101010101100011110011010100000100111100000010110110010100111000101110010111001111000010111111000100010111110100101000110110101000100010110100101010010010000000010000 1100101010010110110000000011001000011101110001001011000000110101000101010001101111011011010111010100101001111111110011011001011101010011100110001111111011101101010011011110000100001001100111011010010111110110111001011001010001111111110110111010010010110111100101001110010011001001011011010010100001100111000011111111111110111000000000110000101011101111111001100110111011100001010101011011101011101101 1101000111110100100101110101100011000100111110010111100011010110111110110110011111111011011100010011101011010111100110010110001011101011111010101100110100111011000001000001010010101101000110111101001110101010010011001011000011010001110010101010101010110000000000100110110110001010001110010110101011000100010110010111000011011001001010010100100011010110001000111001001000111100101010001111011001001100 0101110000010000110110100011110010101110111110100101010100011000111110001101011101101101000100011001110001010111001011010001110011010100101010011011010000000100101110100011000010101001001101011110011000000001100000001110100100000111001001110010111001000000000001101101111100010110101110111000100110101001011100111111001001110001100010001010101010100010111000111111011000000001101000010011011111111100 0001111110110010100010010110010011100000000001001100000000100011000111100110011001110011001011100100010000000010100010100010111010010011001110111011110010011101011110001111011111111001010111110100111011010111001010011000100010000000000000001111101010011110101101001111101110110101000010100110110100010100000011011000110111100000001111011110000110000011111101001101000011101100100100010110110010111111 1011000011100011000011001010110001100110101000011100011111000101011100010111100010000111001011101110111100110011000110111101011110000011000000111111011100001001001010110000110110100011100111011111100010001100001111100101110111100000100100100001100000101101101011100111010010010001010110101100001100010001000001011011001110111111000011101000111110001111111001011100110101000000011111000010101100110011 1110110010010011100011000010010010111100011110001100001001101111100100011000000111100000111001010100101001101101000100111001110100001011001100111010101101001011011110111010110001010000100010111110001001010011101101011001101011101010011000010101111011011010010000001100001101110101100001011101111011110110010001000111001001101010001110001010111001011010010111101110101011010111010011100011001001100010 1001100101101110001001101100101010000111101110100000111100010111010010101111110110010101111101100000111001100100100110010111000101111011010100011101001100111000101100101011101011000111111000010000001011001000111000010011101010111101010010101100010111001100101010010010110101011000111111101000101011101111001100100100100100000011011001101011110110011001001100010101010101111111111010001111010110100001 1000000001110000001111110101111011011111110000110000100010000000110110010111111101110001100111101000110110111010111001100100100100001111001010000110011010100110100001110010011111011001111100110111111110110101101011100111000101110000001110001001000100001110000011010000100010000100000010100101111010100000010100110010001000110110100100101101100101110011110101010111110000001111001111000101011000000100 1110111111100100110001111000100111110101010110001000101010010101110011000000000100011001001000101010001001101010101100111101010001100011101000111100000101100001110011111110100011101010110001101111100111000010111000110010111110111000101100011010101001001001111111010111110111110101010100010101011100100110101010110111011000101100101100010111001101000011101011111011001101101100010000010001000111010000 1011100101110010011011011011100111100110100101111000111110100110011000000100101000001111011101010110101011000001010011101110100001100101010111000111111110101111111100000010110011111110000000010100000111111110010100101010110010001011101101010110011000010010101110000101001101110001001001101110010011110001011110000110101100100100100011100010000001000110110011101010011011111100010000110101010100111001 0010001101000011011110110001011111010011000111111001011010100011000000101000110110111010001110010000111100111110111101000000100100111110000010010110010010110101011111001111001001010010011111001110000011110101010000011110001010000001101100100101001101110101001001110000001111100010110100111101100110111100101111000100001001101011101100110100101000000010110000101101001001100010011111100101111011101101 1110001101011001101100000111110010001010011010111110011110111001000001000010111100010111101110100100001010011111100101010011010111011111011101110010000101001000010110011011110110010110101011100011010011010101101111111101101000111001001011011011010011010000010110011100111101010011000001010011001101011010001110010011111100010111011101100111000110111001000101000001111111010010100001001010110110101010 1111101011111101101001111010010100111011111110000101011110010101110100010000100010111011011100111011101101110111011011111010100101001100110010011101111000011010101001110101011101011110011011011010111010110100101001100111000010001010001010001001100010010000111110110110010100010100101000001001000000010010100011010011000000000101010000110110111100111101001000000100111111010100101101011110111110001100 1111110110011100110000010011000101000011100110011001101010100000100010010010010101000000001101011100101000011010100011111100110001101111010010110010000100100000100111100101010001100010110110010011001001111010110011010111000011011100111110100101010100110110001100100101010011010011010001111110101100001111111101001101111110011001011010000110101100000111100101010010010101010011001000011101000101110010 1110011001010100000011111111110111110011100100101001100100100001001111010000010011101101010110000100001110001111011111010111001110011110110001101100000100010110010100011010000101000111100011100111010101010101000011111010110010011101101110011110011110110011101110010011101110101000110101100000110110100111111111110010001011010011110011110100001101011001111100111100100100100011010011101100111100011001 0010101000111010101110101101111110100011111100000111111001011011000001011110011011101010100110100101011001011010110101000011100101000100100100010111001101101001101111101001111110001001001100011111001010100010000101101111100000100000100101000001101111100100110001000101110011110110010111101010101011010100001001001111000101000011000010101001101110100101101001111010011001100110100010000000010101111001 1110000101001110110011010000110100000000101010001111100111101101000110001110111111010010001101011000011010001110001010101000100011100011111011100000111100100110110011110011001001101110100110110110110011100010000001101111001001001011110111010011110110110001011000111000101101000000000000100000100100001100011001110100100011000011101000000001011000010110110100001011101000111001100111111110111010111100 0001001001110101001110111110011001011001110001111010100101110110101001011101111101000010100110111000101111101100001010001110110111010110001001010101001110001011001011010001001011011100010101011001010111011000100110001001001110001100101010100010010110110111000101110000111011001011101100001000010110000111011000001011111101000110100010101000110101110000001111011110010111101110011010001111101110100000 0010110100000000010001011111100010000111011010110110011000000110010101011000001110010010001010110111101001110011111101010110101011110001010000000010001010000100101100000010010000010011001011011111000110111010111000100010010100010111000011111001111010111101001100011000110001011110010110010011010110011001000000111110110000001111110111010110100111111000000001001111000011111010100010010111111111000111 0111001010001000000101010100010111000010101001000101110110111011001110011110000111000100111010001101000011010101001101001101000100011010101110010101100101111011011011101110100100010110110010111010100010110000000111000010001010111100000000111100101000111100000111110000110110111111011110101111011001001000001000011001100101110110000000100000100010100010100111111010100000011111111001001110100110110100 1111011011001001011010000101110111110111000110100100100000100010110100010101111101111110010101011001100100000010011011011110010000101010010111001011100010001010110101011100100011110011001010100110001011110100010101011101010000110001010001100101011100101000000010011011110011101101000110010001011110011110101010111001011101100000101000110110100100000100010100101000101001010001010101001011010111000010 1101010010110000101011001110011100110100000001101101001011000001110011001010101010110110101010000101010101101000110110010100011110001001000101111111000101100101110011000010110100011011100000001011010010011110000100101101001101000100001111001110101111100001100010000011100011100110101011111011001010001100110001001010001100000011011111110100000100001010101001001000001010000010111010011100011001011111 0000000000110101001011100011001010100001010001110100100110011010001110111110011100011101110100011101110001011111001010111100001110011010111101100000000111011101010110111011101110101100110110010101011000100011100111110101000100010101111001111110001111111101010110000001000001110100100101110010000100110101011000100100100010000110000000100001000101000111000011010110001011111011111111011001011101011000 1001000001111010011000111000011011100111000111010011110110000110011101110011000001010110100010100100001000001101101101111000100101001000110111000010010000111111100101111101011001111111111111101001000011100000101110111111101010111011000001101010000111111111111101000011011001011011111101000011000100011000000100100001001111100010011000000011010011110101100001111111010100001011010011100011010110011011 0101000100111010001000100100100000111011101000111010010111010001000110110101001000010001111110101110110100101001010101101111111000100000011010100010011010000011100010001101101001001001110010001101111101001011100110010000001000100001101111110000111011110010100000011011111010000101011000101110000101111011010010010111100011000000001011111011110101010011110011101010111100011001100101110001010111110000 1001110111000111101110011101001101000000000010010100010111101110000110000001011101011001100001101000001111101001010101010110011010101111011110010011110011111110110101101001111000000101010000000110001110001101101010000011101101100110011011010111001010000010110001110001000111000001001100000110001001111101010110001100111110100011111110101110101000000011001101111100011110011110100010101100000000010101 0111001011101011111100100000001011010100011010110001100100101100000000010110010110011010111011010000100111010010010011010011010111111000100101000011010111100111100011000111010100111101111001001111100000100101110001000111010010100000110010111100010000111010110000011011110111110111000001010011001110000111010100010111010010010111010101000011010110011100011110100001111000000111010001110111011101001011 1110111101111111100010100110111010001101011101101101111011000110100100101000010111110010001010000111111111011100101100100010010111101011001001010100100010000100111010011100110111000101000000011110010011100101011001010000100011000110101011101110000011110101000101000101011111101001111000011011110010111101001010110100100101000111011011110111001110110100110011111101100100011101110010111111011111100110 0100110101111000001010011000111101110001001111010000101101001110010011010111110101110001001010001101110000110001110110000010001010001011000010111000100010100110011100101111110100100010000000111011000000010101000011001001100111110110100100011000010101000010110110000110001100110011100111101010001101000101110011011001010011110001101110100101001110010110100111101101001011011111011100011001111000110000 0010000010110101110000110111001111000111001001010110101101010000100101011111100000000000000010100111011011000101011001110110101100001000111110000110001110010001111110101000001001001110001011110110101101111010111011010101011011111100010111010011111001111110011100110000011010101100011100101001000101100000100101100001111010111101111011011111010000001101111001101101010101100110111000100101100000000011 1000000110111000101000010100101000011100001111111111011011101111000110001010111001111011000000101110110000011101011001110101111111110001100111111001101100011000000000111101000100010101001111101000101110111110100001100100010011101010110000111110011001101101010110001001000011010111110010111101001000110101010001000011100101001001011100110011010101111101100110111011010010111000101011111011000001111000 0100010111011101010001000001001110010110011100101100011010100001000101111011111001101100100001000100101011111100000001000111010011111011011101110110111001010110110011101011011100011100111101011100001100011011000010011010011111111010100001010001110100100101101011011110100010110010111111101101011001001000111111010100100111010000001110010011101101111010111010001111101011000100000111000010100011000101 1100111010110001111100000100101101110100000001001100011111100111101111111010110101100010110010110100001100011010110101010111001011111110000111100110111110011111101011100000001011011001000110010010101011011111101100111010101011110101101110001100111011111111100000101010100100111001011011101110101000000011011010000101000100101100111101101000110011100011001011100011101100010101100010001001001101110110 0110110111100010010001001100010100101011011011110100001110100101001010100011010111001111111000001100011111111011110000101011000111111001001110010111110101011110001010100010111010100100000000010111000111001100101000001000010101000101010000110101101011011010101101001101100000000001000000010110110001110100101101010000101100111101100100001001111001101111000110110110110010100110000010111011111101111011 0011000001000001100111001001100110010101111111100000001100011111011101111110011110011101001111010111010000101100001000011010100110011110011111010011110111001110001000000110010111010100010001000001011100001001101001100011100010001111011010110001100000101101111011011011110111001010011111000110001001111111010001100011111010000001101000111001011100100100111100110011101111110110001010011010111000001101 0100110101101110010111100011100110101111010110000101100110001011110100000101110100111100101110000110111100110101011110110111101000000000110111000000000010001000010001111110111000010111101100001110001000111010010010000000000000001100101110111000010110110001100101111101011010110010110100110001111111001110111000110111000010100001111010111101101011111110001001010100011111110101000001001100110011111101 0110110011010110011000010010100011010100001011011011110010110011000101111001011010010000101010010100101001100011111110010110110100110110001111001001011111111100001000000010100100101100000101011010001011101100100010111111011100011110100010110110010100100100110101110101100110101010101111101111010000110111111001110010010110001110010001110110110011000011111000111101011010111100110001101110010111010010 1011010110101001000110100110000010000010000010010111001000110101010010000000001111011011101000010100110110011100001000010000010001111011001010010001010101001101011111000010011110001000100111110010100001100101011000101001111100101000100110101110011101110001001001001001001000110000001101001111011011101001111101110101111011111011111010110001101101101101010000100110111001011000011111010001100000011010 0111001100101011101010000111011001011101010010010101110011101110011011100100101010011010001001000010110110110001100011101010010001011000000010011000001110100000100101101110101011110010001010001111000000100101000001110011010101111010011100000100010111011101000110010101010011000001010100010110101000001111100011011010111100101110111111111101100011101101101011000100111000111100011001001001000110001110 1010000011101000010110110110101010100111000010101010001100010001000000111010000010101010100101111011001101011110110101111000011011001011111011000111011011001011011101000010100000011000010011001101011010110110010111101110011010001110001010101001001110000111000011011000001100110000110000101100000100100101100100101110000011101010000111001000100110010111000001011101111111101001101001100000110001111110 0100111110101100100101000111011100111001110111111100010001010101010011101101000111000110111010011111000011000001011101001010011110111100100101100000101011111111010100001011001001001100011010001100111110001100110111011011100000100111111110010001011110111000001101010001111011011000011000101111010111110100010011101011001000000001110110110000101011100111010100101010010111000110100010111011001010111101 1101111111111001000101101100110000111011101111111011011001001001100111000001000000011010111111001011111011111011101000000100010110000001111011100111110100001001100111101010000110001000101000010000010110010011011011100101111001000010011001110000001011101001100001001000010111000100000101000010011001011011011000001010001001010010010110010001100010111010100011110000110110011010011010111010010111100100 0000111001010111011100001111011110001000101111101011011110100010011001100001100000011110011101111100000011011001011011011110100011001110111111101110100111100000111011101010101011100111000011001111100100101000010111010010111010110100010101111111001000100001101010000011111011110100101101100100010110011111110001011111010001000010000110010101011101100100001101111010101111011100010000011011011110110100 1011111101011011100011110110110011000111100001111110000011010011101011000001000111101111011011111010110101101101010101111000010110000011101001100111001010110011110011110010111011011110001010101110001100100101111010010010101011011001110110100110100100111011111000100011000110000110000001111000111001110101101101110001101100010000000100010110101010101010101000011010111011101101110100111101011110000100 1110100111100001101101110100000111111011000001111001111101101010111101110101000010101001100110111011100000110100001111101110010011000011110001110010010110101000110100011110100111101010001011011010000011111100011010010101001001100101001011100110100111110110010000110011000100010110010110010011010101011110011110010111111100011111000010000111111111010010110000100010101101100001111001000100001010100111 1100001100101011110100010001111011001001011010010000011111000001110000100010110010111111110100010001110011011100001001010100000000101000001010111101011111110111111110111010101000000000111001011001000111101111010000101110110000010011011110010100001110000110110111110001000100101101111010100000110110000110110000100010001011010110011000001100110111111000001111101000000100100111101110001001111111011000 0100011110110110110011111110000000100011111011001011100100010101011100010110011011101111001101011011101110100110001001000101010101010000000011100101001011111100110001011100100001100100010000001111110101001100011111001100011001111001111000101110011011110110110000011000001010010001100110111101110101111001101000010100001010100010111100010000001010010011100110010100111111111101100000010010011000111100 0010100100111111011101110110100110100000100111111111001001000001100011010000001000000010010000001111110111110101111000100101000011110000111110111001101100000000111100110100011000000010001101101010101101101010011011100010011101101110011100110101000101110000010001110000001010110010001000101100100101101011110110001010101100101010000101010010110000000001110101010100101110110011101011010111001001101100 0101110001011100000110100110100101001100101101101111111010001011111000000111010011010010000011111010110010001010010000111100101000101111011110111000010010101010101010001010000010000011000011110110001011000000111010101100111110100100001101001100000111000010101110011110011001001001011100000011010101001101011001111011000000011111100110011001000010011101100001101111010010100000111101100100110100010001 0000011001110011110111001111101000110010110110111000011011110011000101000000101110100001101000001000011110111011001001011110010100110010010100001100011101110101100001100111000010111101110001010000000010001011001000011100110000111001001000101001101100001010111001010010010110100111111100010100001000000101100100010101101000000110101000100111101000110101001111001011110110110000100000011100010111101000 1010001011110001011100111111100011100010100100000110010010000101001001110001001011110111110011011000010000100001010111010010000101000110011100001011001011001000101011110100101111100101000011011110100010110111111110110000000000111010010101011100101100101000110111010111110111010001110100110001111010010110010101111101110110010000100110111011000011010110000110101010001001110010100101000001011000111110 1001100101000001110100111000001011001010100100101100001111110000111101011010110000001010110001100111010100001111110011101101111110100111101110100111011100101011111110001111011001000111010100110101011011001011010000000111111110010010000010010011001110000011101010101011001100010001010000010011001010010010100000100111111011110101111101010011000000010111000000000000100101001111110011111101101001010111 0101100100011000111001010001000100100110100011100001111001000110100010001011000011001110011100010111101110001110011111100010000000010110100101100011011000000001000110101100001000111100100100011011100001110100001111110010000100111110100001011110100111011001100110111001000101100111011110010111101110011100010100100111000111000111010100101101010100111011010000011011110100100110111011001100000011101000 0111110111101001011011001110011010010111111110011010111111101011111011100111001101110101001001000011101001010010100101100011101101101010010101101000000100110110100000001111000001011101111100011000010011010011011001111101110001100000100011110110110000100111111100010100111010001001001111110010001010000010101100111000001110101001011001001100011011001001111000110101101011110011000101011110011100000100 0011100001110101101101101101100000110010110011000100101110110110100011010101001101001001111100111001011101010011110110001010001000000010111011111100010000111011110010001111000111000111100010010110110110100111111000101001110100110110111010100010110001010100011000100111010010011101001100111110000001100011000101111011101100000000100011101001100011010110100001101111111110011011111011111011100011100101 1010100111111000001100011110110011100110101001100110111110101101110011010000000111000111011011100111000101110010110100111100001000000100100111101101000011001001001111001110111011000000010001100101010001111011000011110110010000010110110011010011101100101000101001111111100001111011010111110000100100101011011010110010111001111101011001000101011110000111010011100111110000010110011010000111011110001001 1100010111100000011001001110101011001011110100010110100110101011000001111101101010011011000110100100000111100111101100011101101111101011000111000100010101110010000100010001000000010111010100010000100101110010010101000001011011100100001011010010101110001001001001100110101111010000100101111010010000111100111010111101010011010011111100000100100100010000010000000010101010101110100011011100000000011011 0111001110001111011001001101110110100001110111011001010000111000101101010101011110100101100100000110111100111100010000011110011010100101010010110010001000011101110011001001100110100101100011011110111011010010000011010000101000000010010100000100010110111111100000101110110010000101010110001111000110001010110000100110111010101011101101010110000111111001111000000001110111111111000011010010110000001000 0111111110001000100101100010111000110001011110100110110011001111110000011001111100000001111111010011010001100101100010001101101111001001000111110110011111000011110000101111001101110110000000111010001001010100100000010011111110000110000011111010111011100110101110010100110010110110001111000010101110000111111111110001111110010011111110010010000000110000001010000110000101010100100010111111101101010110 0010001001101100101011101101001100011111111011011001001111100110001001111110101010000000000111101000000110111010011010111110001100000111101001100101010001110001111110101000011010111110101001000010010010110001001011001010100001011011011001111011100000000100110010100001011101000110010100010000011101110011101001111111000101000100111101011011110110000011010101001110101111101000001001010010001110000001 0100100010000000101001000001111001010001101011001100011111011010001100001000010001010011111010110011000000111010010100110011100010100011101101101100100111111000101100111100001110111001111011000011101111010011000010001010100100011010000110010100110011001011101000011011100011100101101100000110100010010011000001000101101001101001000010101001111011101000110101001000111010100101010101100101110100000111 0100011011011011101011100111100010111011111010000110011011111110110010101001011000000011011000101000100010011110010000000101010110110100000101110010010011110001010111110101011111010101001101101110001110100000001100011100000000010001111101011000111101000011010111100001101010001010111101110001010101010110000110000101110000010111100011001010001110100011110111000010010101001000111010011011101110000011 1101111101101001111001001000110100100100110000010011000000011111000011111110110101000000100110001110000100001001100111001111100100101100011010011111000101010111111110110111011011000111110110001100010111001110011001001010000011100101110110010101011010110000001001001011011001101110000110111011110000010101100011001110101100100100110101111110101101100011111001011001000100001011100101100111001001111011 1000110011101110101101001110011101100111011100110011101101010011110101110010001010011001001000000110001110110110100111001000110110011110101101111111011110110001000111001100010010010010111110010001000000101110001010101011000001110011100000100111001111010111011010100110111110011001000001001000101001110011010100111000101100100101100001010111000100000000101100000111100100000100001010011001011001111010 1010111101111101101001000010101101001111100011010010101110000111111001110001011100101101000101011111000010001001010000101010010010110111010000010010011101111010111011100011010000010100110101001001001001111101011000100010000100010011101100111110111010111100010000111111100110111010100111110100101101100000111011100101111010101101011111110111110011011110001001110001100110010111001010011100010111000001 0000111100110100010111000010011110101110010011000111110001001011100001111000101010001101110110100101010110010001010101010011000111010111110001100111101100100110101000100000110100001010101011111001001100001110001101100100100100100011000000000001000110001001101010110010011111001000000010000011101010000110101001100110011100000101111101101000001011001100100000000001011111011111101001000111110000011110 0111010111110000010000100001010100001111101111000101101011110010101100111010000111011111100110011001110011111000010110110110100111010010001010110000111111111001000110001011100011000100011101000001001101110011100001001100100101011000101010101110101010110001101001110100011010000111010010011100000110000101111101111011110000111001100010101011111100010010010010101010100111000110100111010111011110011100 1110010110010111000111010011111110101011110000111100101111110001011011010110110110001010100111011110111100100011010101100001010001111011110100100100101011011011010111110010000010111111011000110110101100011111010101001010011000001111010110010011111101110100111001110110101000101110000111101010100011001100111101000000101000001000100111000101010101110111000010010111101101101100100100101001101100101101 1100100110011111101010011000100010011001011101111100111110110011001101000110111010101101001101100101100011011100011011110100010010111011000101100011111001110001011100100010110111101110101010011001011011000110001001111111000110110111111010101101001111111100011011111001011001100111111100100111001000000100111001011000011001000100111010010010010011010101010101000001011001001010011000100010011101111101 1010011000010100100001011101000000011011001000101100010010111000000000111001010111111110101111101110010000110000111100011110101011011100001111011001000100010111110010111101110100101001100100000001011100011111001000101000101001000001101100001011100111110101010000000011011001011011111000010010101010110010110100100000001101101011100100100010000111000000010111111011101110011011110101101110110101000100 1101111001110011000111001110101000011001001011000100100101100010100110000010110100011100010110110001010011100101010110110111101011110000101000101101010110110100101101010011101001011111001001000011101011010010011111101111001110001011110001110110001101110011011110101110011000100101101101010011111110011010101000010000101101101101100001000011110111000001100000110011001110001001000111010000101111100111 1101101011110111000101001001110001000101000101000011011111011010010011000111111010001101110110100110110010010100100010011110101101001010100011100000111101111111101100011010101111001110000101000001011000011010101001110110111110110010110110111101001110101011100010001010010110111101011011010110000101010111011111111111111111111101011111001101010010001101001111100010001000101110000000001111011001000001 0010001010100100111011010011001010110101000111001001100110001001001010001111000000110111111110110111001000101110110101001011001111001000001101110010111001000110100111011101010001100101001100011101010110010101001100001010100010010011010100001111011000111110000011110110101010010111110110101001111101001000010010101111010001001100111011100001110011011110111100010111000000110111111000111000101000100100 1000100010010011001010110100100000111100111100111100011010111110001100101111100001100111011101110000001010010110100111010010101001111011011111000000111110110100000001011001100101011111100111100100011010010100110011010011100110100111111011101010110100000101100011111111011110011000110011110100001100011001010101001100111100100101001011111000101000000110001001101110000000000001000010100111001110111001 0011001010100111011111111001110101110011101000101101011010101001111001010111010011111111111110001110000100010011001101010001001010100101000000001111100110101011111011110001100111101110110110011010100010110101010110011001111101110010010111111111001000101111010111101100111010111111100110011010011101111000010100111011001001001000100100000000101110110111001111110111101000111101101101111010100011000111 0011001001001000010110111010001010110001101101100100000111010111000011011000001110101110011101001011111110000101011001111001111001110111101111011010000010001100011111101000100010110000001110111101000111000010000011100101010011100100100111011011101100010111001100111110101111100111001111000010010110110011000001101010101000110000001101001000110001110000010001000110010001100001111000111000000110001000 0010010000111000001100100000001100111000101110001001101110101011100000011111100010011100000001100101011111101001011001100110111110011101111011111011010010011110100110101101101111001000001011010101010101110011101001000011111100101000011000101111001110001111010001100011011100001110111010100001011010101011111111101101111110100110111000001101111001011100010111010100101110011110110000111111010001000000 1110110101100101110010000100110010001100101011101101000000000110011011110010100001010010011100110100011100001000100011111101110111101001111001110001101111000101011111100000010011000011000001001111011111011110000011101110101011000000000110101000000110011111100101110001100110011000000001000101010110110011111111100011111001110110110100110111000100101000100000010010000101110101100000100110010110110011 0000010010100010101011110011111010010010100100010100100101111101110100010010000010101101011001110110100110111001101101011000010100111101101111111111110000011110011101111000010001110100111101010001010000101001010111101011000100000101001001010101110100110010111000111001001000011000111010010110010101000100011010111111000010101001011011111111011001100110111110001111001101100001011011011000001101011000 0011001001100011101110000000011110011010111001000110110111111101011001000111000000101011000101010101110001100100000011110111001001000011001101100001010101001101011101010010110011101110110001110011100001011010110110100100000001110100011011000100010110010010111110111111101001111101010100111001011111100001011110111001110001011101011111100000101100010011000001001011110110000111111011101010111010101110 1111110010001100111100001001000101101000000010011011110111001010100110110100001100100001001010000001111100000000001101000101110000011001110001101010011111100101011101100010111011100111110100010100000111100110101101001000010111111001110111100010011011110101010001101110011010111111000000011000110000111100010100111101000001001011010011011000010011010111011111100011111011101111111111010001111000011000 1000111110101110001001011001011010001100010010001001101110000101101101101001000000100010100100111100010011100010110001011011111011100010010000100110011101101110110000110001000001101010110111010011011110001111001010011010110111011000101101100111011110100100011110000001111110010110000101010100101011110010101011001111100100001111010100000101011010010001001000111000101000110110010110101001101100010110 0111010000101101110010000010010101101001111001100011111100111001010100101101111111100000111010001000001000001110101001010110001011010000001111100110010110011100111001000000100010111100000111100011010011100010000011001100000100011001100010011000001100101001111010000010110001100111001000010000100010111001010110101001000001100001110101001110111000101101110011100101010110111110111011101010010011101111
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