www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - BigInt and xor

reply "Dennis Ritchie" <dennis.ritchie mail.ru> writes:
Tell me, please, how can I replace this code?

import std.conv : to;
import std.bigint : BigInt;
import std.string : format;
import std.stdio : writeln;

void main() {

	BigInt[10] bitArr;

	ulong n = 18_446_724_073_709_551_614U;

	bitArr[0] = format("%b", n).to!BigInt;

	writeln(bitArr[0]);
	writeln(bitArr[0] ^ 1); // not work

}

Output:
1111111111111111111011011100111101100011000110101011111111111110
1111111111111111111011011100111101100011000110101011111111111111
Mar 24 2015
next sibling parent "Rene Zwanenburg" <renezwanenburg gmail.com> writes:
On Tuesday, 24 March 2015 at 15:45:36 UTC, Dennis Ritchie wrote:
 Tell me, please, how can I replace this code?

 import std.conv : to;
 import std.bigint : BigInt;
 import std.string : format;
 import std.stdio : writeln;

 void main() {

 	BigInt[10] bitArr;

 	ulong n = 18_446_724_073_709_551_614U;

 	bitArr[0] = format("%b", n).to!BigInt;

 	writeln(bitArr[0]);
 	writeln(bitArr[0] ^ 1); // not work

 }

 Output:
 1111111111111111111011011100111101100011000110101011111111111110
 1111111111111111111011011100111101100011000110101011111111111111
Looks right to me. What output would you expect? Also, if you need a bit array you can simply use std.container's Array!bool. It's specialized for bool and uses only one bit per element.
Mar 24 2015
prev sibling next sibling parent "matovitch" <camille.brugel laposte.net> writes:
On Tuesday, 24 March 2015 at 15:45:36 UTC, Dennis Ritchie wrote:
 Tell me, please, how can I replace this code?

 import std.conv : to;
 import std.bigint : BigInt;
 import std.string : format;
 import std.stdio : writeln;

 void main() {

 	BigInt[10] bitArr;

 	ulong n = 18_446_724_073_709_551_614U;

 	bitArr[0] = format("%b", n).to!BigInt;

 	writeln(bitArr[0]);
 	writeln(bitArr[0] ^ 1); // not work

 }

 Output:
 1111111111111111111011011100111101100011000110101011111111111110
 1111111111111111111011011100111101100011000110101011111111111111
Hi, Well it works, the las bit is flip isn't it ? What are you trying to achieve ?
Mar 24 2015
prev sibling parent reply "Ivan Kazmenko" <gassa mail.ru> writes:
On Tuesday, 24 March 2015 at 15:45:36 UTC, Dennis Ritchie wrote:
 Tell me, please, how can I replace this code?

 import std.conv : to;
 import std.bigint : BigInt;
 import std.string : format;
 import std.stdio : writeln;

 void main() {

 	BigInt[10] bitArr;

 	ulong n = 18_446_724_073_709_551_614U;

 	bitArr[0] = format("%b", n).to!BigInt;

 	writeln(bitArr[0]);
 	writeln(bitArr[0] ^ 1); // not work

 }

 Output:
 1111111111111111111011011100111101100011000110101011111111111110
 1111111111111111111011011100111101100011000110101011111111111111
What exactly is not working? The only thing I see lacking is an ability to print a BigInt in binary via writefln("%b"). Up to 64 bits, arithmetic and bitwise operations, including xor, are available with long and ulong. Just print the result as binary: ----- import std.stdio; void main() { ulong n = ulong.max - 0b1000101; writeln (n); writefln ("%b", n); writefln ("%b", n ^ 1); } ----- Output: ----- 18446744073709551546 1111111111111111111111111111111111111111111111111111111110111010 1111111111111111111111111111111111111111111111111111111110111011 ----- If you need more than 64 bits, take a look at BitArray here, it also has xor defined: http://dlang.org/phobos/std_bitmanip.html#.BitArray In the future, please explain what problem you are trying to solve, as the wrong code alone often leaves one guessing. Ivan Kazmenko.
Mar 24 2015
parent reply "Dennis Ritchie" <dennis.ritchie mail.ru> writes:
On Tuesday, 24 March 2015 at 16:35:04 UTC, Ivan Kazmenko wrote:
 What exactly is not working?
Everything works. I'm just a little forgotten properties of the operation xor. I just wanted to xor 1 each digit in the number of type BigInt, while I would like to store each number in the binary representation of the array BigInt.
 The only thing I see lacking is an ability to print a BigInt in 
 binary via writefln("%b").
Yes. It would be nice.
 Up to 64 bits, arithmetic and bitwise operations, including 
 xor, are available with long and ulong. Just print the result 
 as binary:

 -----
 import std.stdio;
 void main() {
 	ulong n = ulong.max - 0b1000101;
 	writeln (n);
 	writefln ("%b", n);
 	writefln ("%b", n ^ 1);
 }
 -----
 Output:
 -----
 18446744073709551546
 1111111111111111111111111111111111111111111111111111111110111010
 1111111111111111111111111111111111111111111111111111111110111011
 -----
 If you need more than 64 bits, take a look at BitArray here, it 
 also has xor defined:
 http://dlang.org/phobos/std_bitmanip.html#.BitArray
Thanks.
 In the future, please explain what problem you are trying to 
 solve, as the wrong code alone often leaves one guessing.
OK, I will try.
Mar 24 2015
parent reply "matovitch" <camille.brugel laposte.net> writes:
On Tuesday, 24 March 2015 at 17:28:50 UTC, Dennis Ritchie wrote:
 On Tuesday, 24 March 2015 at 16:35:04 UTC, Ivan Kazmenko wrote:
 What exactly is not working?
Everything works. I'm just a little forgotten properties of the operation xor. I just wanted to xor 1 each digit in the number of type BigInt, while I would like to store each number in the binary representation of the array BigInt.
xor it with -1 instead of 1. (-1 is store as 0xfff..f with the classic modular arithmetic)
Mar 24 2015
parent "Dennis Ritchie" <dennis.ritchie mail.ru> writes:
On Tuesday, 24 March 2015 at 17:35:14 UTC, matovitch wrote:
 xor it with -1 instead of 1. (-1 is store as 0xfff..f with the 
 classic modular arithmetic)
Thanks.
Mar 24 2015